我有一个我必须建立的程序.该计划取决于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_PATHldconfig是好的,ldconfig -p找到两个libA.so和libB.so-lB与-lBB它给了我一个链接错误,因此我认为gcc正确的找到libB.so,即使它没有在可执行链接.我做错了什么?我可以做什么来将可执行文件链接到两个库?
Job*_*Job 11
大多数Linux发行版(我假设你是基于输出使用Linux ldd)似乎配置gcc为传递--as-needed到ld默认情况下(例如,见这里用于Debian).这意味着如果库/可执行文件DT_NEEDED实际使用了该库的某些符号,则最终的库/可执行文件将仅依赖于库(即,具有该库的标记).
在您的情况下,main.cpp不使用任何函数,libB因此链接器不会添加libB为最终可执行文件的依赖项.您可以通过将--no-as-needed标志传递给链接器来解决它.例如,
gcc -Wl, - 不需要......
当然,正确的解决方法是重新链接libA并确保它libB列为依赖项.