1

我在 linux 中有一个案例,其中 gcc 和 ld 干净地构建东西,但是在运行时我得到一个未定义的符号(对于 libxerces-c.so.28 中的某些东西),由我自己的一个共享库报告,在运行我的程序时.

第一个假设是缓存坏了,最近安装了 xerces 或类似的东西,所以我运行了 ldconfig。没修。但是将 /usr/lib 添加到 ld.so.conf 然后运行 ​​ldconfig 确实可以解决它。

我的理解是/lib、/usr/lib,也许运行时动态链接器总是搜索一两个其他位置。

??

(唯一不寻常的是这是一个使用 jni 访问应用程序共享库的 java 程序。再说一次,如果这是合理的,我应该在这个应用程序的过去 N 年的任何时候看到这个错误。)

4

1 回答 1

4

在这种特殊情况下,该库位于 /usr/lib 中,但也位于另一个项目中(链接器首先找到了那个)。它一定是一个坏的/不完整的,因为它显然缺少一个符号。

我通过运行我的程序来解决这个问题

LD_DEBUG=libs ./a.out

这让我看到链接器挖掘不同的搜索路径,我看到它抓住了错误的路径。

哦 - 并明确地将 /usr/lib 添加到 ld 配置中?这只是将 /usr/lib 放在搜索路径中比通常更早的位置,并且(运气?)使 ld 在坏库之前找到好的库。

于 2010-12-13T19:08:04.237 回答