在Linux环境下编译链接C/C++项目,经常需要加载动态库,包括系统默认的库和外部的库。具体来说,加载库可能会在编译阶段和运行阶段发生:
1. 编译时定位库:
在编译命令中给出库文件的位置,-L
参数给出动态库的路径(相对或绝对),-l
参数给出库名(不需要前缀lib和后缀.so,.lib等)
2. 运行时定位库:
运行时寻找库的路径,分若干优先级:
-
$LD_LIBRARY_PATH
:从该环境变量对应的路径中找; - 可执行二进制文件的DT_RUNPATH字段,一般由Makefile负责写进去;
-
/etc/ld.so.conf
:这个文件里有一些路径 - 默认路径:
/lib
和/usr/lib
实际交付项目时,不应使用第一条,依赖于用户去配置,一般是用第二条,把需要的外部依赖打包进项目中,通过runpath去寻找动态库,这样不会给用户带来困扰。
第三条的话,一般是作为用户来说,会把/usr/local/lib
加进去,囊括一些通用的库,比如boost,或者用户自己常用的库。
第四条主要是系统库,一般不要直接往里面添加外部库。
网友评论