我使用动态库libexample.so制作程序。动态库依赖于另一个动态库libtool.so。
由于来自gcc的消息,它看起来链接成功链接了libexample.so。
Building target: libexample.so
Invoking: GCC C++ Linker
g++ -L/home/takehiro/Documents/documents/code/lib/tool -shared -o "libexample.so" ./classes/example.o ./classes/example_template.o ./classes/example_test.o ./classes/impl.o -ltool
Finished building target: libexample.so
cp libexample.so /home/takehiro/Documents/documents/code/lib/example
但是,它无法将其与libtool.so链接。
ldd /home/takehiro/Documents/documents/code/lib/example/libexample.so
...
libtool.so => not found
...
我在/ home / takehiro / Documents / documents / code / lib / tool下检查了libtool.so的存在情况,该工具由上面链接器中的-L optoin指向
ls /home/takehiro/Documents/documents/code/lib/tool
libtool.so
这是第一次根据另一个动态库使用动态库。所以我很困惑。这是正常还是故障?为什么它不能链接它们? 有人对我有建议或解决方案吗?我很高兴。 非常感谢你。
答案 0 :(得分:2)
-L
选项所做的就是在链接时告诉链接器共享库的位置。
这对运行时加载程序搜索共享库的位置没有任何影响。这就是为什么共享库无法在运行时加载的原因。
当您链接共享库时,还需要将-rpath
选项传递给链接器,以便在共享库上设置RPATH
属性,指定其位置要搜索依赖项。像
g++ -L/home/takehiro/Documents/documents/code/lib/tool \
-Wl,-rpath=/home/takehiro/Documents/documents/code/lib/tool \
... remaining options