try using -rpath or -rpath-link

GCC/G++选项 -Wl,--rpath=

不愿为妞再战 2018-12-30 21:32:12    81 阅读

    我们知道,GCC/G++提供了-L选项用于链接时指定要链接的库的路径,但是这个选项只限于编译时,在运行时,可执行文件并未记住链接库的路径,因此在程序初始化的时候,动态加载程序会报告找不到动态库错误。

    示例代码如下:

    test.cc:

#include <iostream>

void dumpTest() {
    std::cout << "This is dumpTest" << std::endl;
}
 

    main.cc:

#include <iostream>

extern void dumpTest();
int main() {
    std::cout << "This is Linux platform" << std::endl;
    dumpTest();

    return 0;
}
    说明:test.cc编译成 libtest.so,main.cc链接 libtest.so生成可执行文件main。

    问题:

扫描二维码关注公众号,回复: 6046603 查看本文章

        使用如下命令编译main,在运行时报告找不到 libtest.so:

            g++ -L./yepanl -o main main.cc -ltest

        运行结果如下:

            $ ./main 
            ./main: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

    解决办法一:

        设置运行时环境变量 LD_LIBRARY_PATH,这种情况适用于嵌入式运行等环境:

             export LD_LIBRARY_PATH=./yepanl:$LD_LIBRARY_PATH

    解决办法二:

        编译链接可执行文件时,增加 -Wl,--rpath=选项,链接器在可执行文件头中记录动态库的路径,动态加载器运行时读取动态库路径,加载动态库。这种情况适用于主机开发运行环境:

        g++ -L./yepanl -o main main.cc -ltest -Wl,--rpath=./yepanl

    总结:-L选项用于链接时搜索动态库,-Wl,--rpath=用于运行时搜索动态库。

猜你喜欢

转载自blog.csdn.net/lusic01/article/details/89214976