C++ 如何根据另一个动态库链接动态库?
我使用动态库libexample.so制作了一个程序。动态库依赖于另一个动态库libtool.soC++ 如何根据另一个动态库链接动态库?,c++,linux,gcc,ld,C++,Linux,Gcc,Ld,我使用动态库libexample.so制作了一个程序。动态库依赖于另一个动态库libtool.so ldd /home/takehiro/Documents/documents/code/lib/example/libexample.so ... libtool.so => not found ... 看起来链接器成功链接libexample.so,因为来自gcc的消息 Building target: libexample.so Invoking: GCC C
ldd /home/takehiro/Documents/documents/code/lib/example/libexample.so
...
libtool.so => not found
...
看起来链接器成功链接libexample.so,因为来自gcc的消息
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
这是第一次根据另一个动态库使用动态库。所以我很困惑。是正常还是故障?为什么它不能把它们联系起来?
有人对我有什么建议或解决办法吗?我很高兴。
非常感谢。链接时,
-L
选项所做的就是告诉链接器共享库的位置
这对运行时加载程序搜索共享库的位置没有任何影响。这就是为什么在运行时无法加载共享库
链接共享库时,还需要将-rpath
选项传递给链接器,以便在共享库上设置rpath
属性,该属性指定在何处搜索其依赖项。差不多
g++ -L/home/takehiro/Documents/documents/code/lib/tool \
-Wl,-rpath=/home/takehiro/Documents/documents/code/lib/tool \
... remaining options
-L
选项所做的只是在链接时告诉链接器共享库的位置
这对运行时加载程序搜索共享库的位置没有任何影响。这就是为什么在运行时无法加载共享库
链接共享库时,还需要将-rpath
选项传递给链接器,以便在共享库上设置rpath
属性,该属性指定在何处搜索其依赖项。差不多
g++ -L/home/takehiro/Documents/documents/code/lib/tool \
-Wl,-rpath=/home/takehiro/Documents/documents/code/lib/tool \
... remaining options
谢谢Sam Varshavchik的回答。请让我确认以下内容。对于执行文件,我可以使用LD_LIBRARY_PATH让它知道库的位置。但是,如果共享库依赖于另一个共享库,则它不使用LD_library_PATH。是吗?确实如此,但是使用
-rpath
可以不显式使用LD\u LIBRARY\u PATH。再次感谢您,Sam Varshavchik。我在eclipse中使用LD_LIBRARY_路径。这是一个暂时的LD_库路径。这可能是执行程序无法在共享库中找到函数引用的原因。无论如何,我将使用-rpath。非常感谢山姆·瓦沙维奇的回答。请让我确认以下内容。对于执行文件,我可以使用LD_LIBRARY_PATH让它知道库的位置。但是,如果共享库依赖于另一个共享库,则它不使用LD_library_PATH。是吗?确实如此,但是使用-rpath
可以不显式使用LD\u LIBRARY\u PATH。再次感谢您,Sam Varshavchik。我在eclipse中使用LD_LIBRARY_路径。这是一个暂时的LD_库路径。这可能是执行程序无法在共享库中找到函数引用的原因。无论如何,我将使用-rpath。非常感谢你。