为何使用ldconfig后,Qt项目仍需指定自定义库路径而非系统库?
我有一个采用QMake构建配置的Qt[4|5]项目,包含以下库依赖:
- 通过zypper安装的OpenCV库
- 安装在
/some/path路径下的自定义libnf_cln.so库
我创建了/etc/ld.so.conf.d/nf_cln.conf文件,内容为/some/path,并执行了sudo ldconfig命令。
当使用以下QMake配置时项目构建成功:
LIBS += -L/some/path LIBS += -lopencv_core -lnf_cln
但移除LIBS += -L/some/path这一行后构建失败。
为何需要为nf_cln指定路径,却无需为opencv_core指定?
这是因为编译构建阶段的链接器查找路径和运行时动态库加载路径是两个完全独立的流程:
关于OpenCV的
opencv_core
通过zypper安装的系统库,默认会被放到链接器默认搜索的标准路径(比如/usr/lib、/usr/lib64)。QMake调用链接器时,这些路径是链接器自动扫描的,所以不需要额外用-L指定,直接通过-l就能找到对应库文件。关于自定义的
nf_cln
你配置/etc/ld.so.conf.d/nf_cln.conf并执行ldconfig,仅对运行时的动态库加载器生效,告诉它程序运行时去哪里找这个库——这和编译阶段链接器找库的逻辑完全无关。
编译链接时,链接器不会读取ld.so.conf的配置,它只会搜索默认标准路径,以及你通过-L显式指定的路径。/some/path不属于链接器的默认搜索路径,所以必须用-L/some/path告知链接器该库的位置,否则链接阶段会直接报错找不到libnf_cln.so。
简单来说:ld.so.conf管程序运行时找库,-L管编译链接时找库,两者互不干扰。
内容的提问来源于stack exchange,提问作者Olga Pshenichnikova

