我有一个我必须建立的程序。该计划取决于libA
,libA
取决于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
ldconfig
,ldconfig -p
同时找到libA.so
和libB.so
-lB
更改了-lBB
,它会给我一个链接器错误,所以我认为gcc
正确找到libB.so
即使它没有链接它在可执行文件内。我做错了什么?我可以做什么来将可执行文件链接到两个库?
答案 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
列为依赖项。