Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何根据另一个动态库链接动态库?_C++_Linux_Gcc_Ld - Fatal编程技术网

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

C++ 如何根据另一个动态库链接动态库?,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

我使用动态库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++ 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。非常感谢你。