问题:gcc link过程中在无法找到动态lib 提示错误
.../ld: warning: libcurl.so.4, needed by /home/xx/xx/xx/xx/lib/libtest.so, not found (try using -rpath or -rpath-link)
-rpath和-rpath-link都可以在编译链接时指定库的路径;-rpath-link只指定的编译link路径,链接器没有将库的路径包含进可执行文件中;所以编译时库的路径和在运行系统的库路径可以不一样;
-rpath可以做编译link和执行路径,链接器已经将库的路径包含在可执行文件中,编译时库的路径和在运行系统的库路径必须一样;
LD_LIBRARY_PATH指的是运行可执行文件所要依赖的路径,与编译无关;不管编译是否使用-rpath或-rpath-link参数;
解决的方法:
-Wl,-rpath-link=/home/xxx/xxx/xxx/lib
-rpath和-rpath-link是ld的参数不是gcc的, gcc本身是不能识别这个参数的链接的时候 gcc会调用ld -Wl就是表明这个参数是ld的 gcc应该将其传给ld。
查看库的依赖关系和位置:
在执行环境下(非编译环境)执行 ldd 可执行文件可以查看库的依赖关系和内存位置,是否缺少库的信息
# ldd 可执行文件
libpthread.so.0 => /lib/libpthread.so.0 (0x77383000)
libstdc++.so.6 => /lib/libstdc++.so.6 (0x77227000)
libcurl.so.4 => /usr/local/lib/libcurl.so.4 (0x76dc7000)
libssl.so.1.0.0 => /usr/local/lib/libssl.so.1.0.0 (0x76d58000)
libcrypto.so.1.0.0 => /usr/local/lib/libcrypto.so.1.0.0 (0x76b91000)
libz.so.1 => /usr/local/lib/libz.so.1 (0x76b67000)
libcares.so.2 => /usr/local/lib/libcares.so.2 (0x76b46000)
libssl.so.1.1 => /usr/local/lib/libssl.so.1.1 (0x76ad6000)
libcrypto.so.1.1 => /usr/local/lib/libcrypto.so.1.1 (0x768bf000)
存在动态库和静态库在链接时不要加-static, 否则会导致c库在app里出现多份容易会出问题,
编译环境下执行file 可执行文件可以看到可执行文件的类型 dynamically(动态库连接,stripped):
#file 可执行文件
ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 4.4.59, stripped