如何link动态库依赖另一个动态库?

How can I link dynamic library depending on another dynamic library?

我使用动态库制作程序,libexample.so。动态库依赖另一个动态库,libtool.so.

由于来自 gcc 的消息,看起来 linker 成功 linking 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

然而,link 它与 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 指向 linker by

ls /home/takehiro/Documents/documents/code/lib/tool

libtool.so

第一次使用一个动态库依赖另一个动态库。所以我很困惑。是正常还是故障?为什么它不能 link 他们? 有人对我有建议或解决方案吗?我很高兴呢。 非常感谢。

-L 选项所做的只是在 link 时间告诉 link 用户共享库的位置。

这对运行时加载程序搜索共享库的位置没有任何影响。这就是共享库在运行时加载失败的原因。

您还需要将 -rpath 选项传递给 linker,当您 link 使用共享库时,以便设置 RPATH共享库上的属性,指定要在何处搜索其依赖项。像

g++ -L/home/takehiro/Documents/documents/code/lib/tool \
    -Wl,-rpath=/home/takehiro/Documents/documents/code/lib/tool \
    ... remaining options