如何根据另一个动态库链接动态库?

时间:2016-03-26 14:04:34

标签: c++ linux gcc ld

我使用动态库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

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

1 个答案:

答案 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