gcc构建链接但共享库不与ldd一起出现

时间:2015-01-22 11:50:18

标签: gcc linker ldd

我有一个我必须建立的程序。该计划取决于libAlibA取决于libB。两个库都在同一个文件夹中,但ldd libA.so不包含libB.so,因此我必须在链接时添加它。

这是我的gcc命令:

  

gcc -L / path / to / libraries / lib -lA -lB -I / path / to / libraries / include main.cpp

程序构建和链接,但它没有启动。它给了我以下错误:

  

./ a.out:符号查找错误:/path/to/libraries/lib/libA.so:unfined defined symbol:symbol_used_in_libA_but_defined_in_libB

使用ldd我可以看到libB.so未包含在我的二进制文件中:

linux-vdso.so.1 =>  (0x00007fffaecd9000)
libA.so => /path/to/libraries/lib/libA.so (0x00007effc02a4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007effbfebb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007effbfca5000)
/lib64/ld-linux-x86-64.so.2 (0x00007effc05cb000)

我有这些条件:

  • /path/to/libraries位于LD_LIBRARY_PATH
  • 正常运行ldconfigldconfig -p同时找到libA.solibB.so
  • 如果在gcc命令中我用-lB更改了-lBB,它会给我一个链接器错误,所以我认为gcc正确找到libB.so即使它没有链接它在可执行文件内。

我做错了什么?我可以做什么来将可执行文件链接到两个库?

1 个答案:

答案 0 :(得分:9)

大多数Linux发行版(我假设您使用基于ldd输出的Linux)似乎将gcc配置为默认情况下将--as-needed传递给ld(例如,请参阅Debian的here。这意味着最终的库/可执行文件将仅依赖于库(即,对于该库具有DT_NEEDED标记),如果该库的某些符号实际上是由库/可执行文件使用的。

在您的情况下,main.cpp不使用libB的任何函数,因此链接器不会将libB添加为最终可执行文件的依赖项。您可以通过将--no-as-needed标志传递给链接器来解决此问题。如,

  

gcc -Wl, - no-as-needed ...

当然,正确的解决方法是重新链接libA并确保将libB列为依赖项。