依赖库是在链接ld和运行时都要的so文件, 如果是静态编译,就不需要运行时查找了
当使用源码编译第三方库时, 基本三步骤:
- configure
- make
- make install
假设默认安装到了/usr/local/lib
但此时安装的lib文件并不能被ld程序发现,就会出现unimplemented symbol
错误
然后就需要第一步, 增加编译时查找路径
有2种方法:
- 指定编译时查找lib的路径, 给gcc 增加编译选项
-L/usr/local/lib
- export LD_RUN_PATH:=/usr/local/lib
但是发现运行不起来, 出现加载库文件失败
./a.out: error while loading shared libraries: libev.so.4: cannot open shared object file: No such file or directory
这时候需要第二步, 增加运行时的查找路径
有2种方法:
- 给gcc增加编译参数,指定运行时的查找路径
-Wl,-rpath -Wl,/usr/local/lib
- export LD_LIBRARY_PATH:=/usr/local/lib
终于,程序可以跑起来了
将以上两步合并成一步,但是需要root权限
- 在
/etc/ld.so.conf.d/
目录下创建新文件例如 libev.conf
echo /usr/local/lib >> /etc/ld.so.conf.d/libev.conf
- 执行
sudo ldconfig
将更新依赖缓存,也就是更新/etc/ld.so.cache
这样程序也可以跑起来
总结
如果没有root权限,可以将第三方依赖安装到其它目录,例如本地目录, 并添加编译选项或者修改环境变量
但如果有root权限,直接修改ldconfig 配置则更方便