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

Jep*_*sen 7 linker gcc ldd

我有一个我必须建立的程序.该计划取决于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:undefined 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)
Run Code Online (Sandbox Code Playgroud)

我有这些条件:

  • /path/to/libraries 在里面 LD_LIBRARY_PATH
  • 运行ldconfig是好的,ldconfig -p找到两个libA.solibB.so
  • 如果在GCC命令更改-lB-lBB它给了我一个链接错误,因此我认为gcc正确的找到libB.so,即使它没有在可执行链接.

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

Job*_*Job 11

大多数Linux发行版(我假设你是基于输出使用Linux ldd)似乎配置gcc为传递--as-neededld默认情况下(例如,见这里用于Debian).这意味着如果库/可执行文件DT_NEEDED实际使用了该库的某些符号,则最终的库/可执行文件将仅依赖于库(即,具有该库的标记).

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

gcc -Wl, - 不需要......

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