结论是:这不是“缺库”,而是链接器根本没看到它——得告诉它去哪找,或者让它能认出来;需确认库名与文件名匹配、正确使用-l/-l、设置qmake_rpathdir或ldconfig确保运行时可加载。

直接说结论:这不是“缺库”,而是链接器根本没看到它——得告诉它去哪找,或者让它能认出来。
确认缺失的库名和实际文件名是否对得上
错误里 -lz 表示链接器在找 libz.so 或 libz.a,但它不保证系统里就叫这个名字。比如 -lpangolin 实际对应的是 libpango_core.so 这类带前缀的文件,甚至可能压根没生成 libpangolin.so。
- 用
locate libz或find /usr -name "libz*.so*" 2>/dev/null查真实路径和文件名 - 注意版本号后缀:常见的是
libz.so.1,但链接器只认libz.so(没有数字) - 如果只有
libz.so.1,就得手动建软链接:sudo ln -s /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/libz.so
让gcc知道库在哪:-L 和 LIBRARY_PATH 的区别
-L 是编译时生效的临时路径,LIBRARY_PATH 是环境变量,影响所有后续 gcc 调用——但两者都只管“链接阶段”,不管运行时。
- 加
-L/usr/local/lib必须紧挨着-lxxx出现,且顺序不能错:gcc main.c -L/usr/local/lib -lz -o main -
export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH只对当前 shell 有效;要永久生效得写进~/.bashrc -
LIBRARY_PATH不影响ldconfig,也不影响程序运行时加载,纯属编译期用
系统级路径注册:ldconfig 真正管运行时
即使编译过了,运行时报 error while loading shared libraries,说明 ld 找不到动态库——这时 ldconfig 才起作用。
- 把库路径写进
/etc/ld.so.conf.d/mylibs.conf(内容就一行:/usr/local/lib) - 执行
sudo ldconfig刷新缓存,不是 reload,是重建/etc/ld.so.cache - 验证是否生效:
ldconfig -p | grep z看libz.so是否列在里面 - 别乱改
/etc/ld.so.conf主文件,优先用.conf分片管理
Qt 项目里 qmake 怎么加库路径
Qt Creator 里报 cannot find -lxxx,光改系统环境没用,qmake 不读 LIBRARY_PATH,得显式写进 .pro 文件。
- 加搜索路径:
LIBS += -L$$PWD/../3rdparty/lib - 加具体库:
LIBS += -lz -llzma(注意顺序,依赖关系从右往左解析) - 头文件路径和库路径是两回事:
INCLUDEPATH += $$PWD/../3rdparty/include必须同步配 - 如果库名和
-l参数不一致(比如libpangolin.so实际叫libpango_core.so),只能用绝对路径链接:LIBS += $$PWD/../build/pangolin/src/libpangolin.so
最常被忽略的一点:软链接必须指向真实文件,不能链向另一个软链接;ldconfig -p 输出里看到的库名,才是运行时真正认的名——编译能过,运行崩,八成是这一步漏了。











