如何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
我使用动态库制作程序,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