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。
问题:
使用如下命令编译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=用于运行时搜索动态库。