【问题标题】:How can I link dynamic library depending on another dynamic library?如何根据另一个动态库链接动态库?
【发布时间】:2016-03-26 14:04:34
【问题描述】:

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

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

【问题讨论】:

    标签: c++ linux gcc ld


    【解决方案1】:

    -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_LIBRARY_PATH。
    • 再次感谢您,Sam Varshavchik。我通过 Eclipse 使用了 LD_LIBRARY_PATH。它是一个临时的 LD_LIBRAY_PATH。这可能是执行程序在共享库中找不到函数引用的原因。无论如何,我将使用 -rpath。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多