CMake误检测到/usr/lib中已不存在的Boost库文件
CMake Warning at src/CMakeLists.txt:424 (add_library):
Cannot generate a safe linker search path for target clcsim_models because
files in some directories may conflict with libraries in implicit
directories:
link library [libboost_regex.so] in /usr/lib may be hidden by files in:
/usr/local/lib
link library [libboost_program_options.so] in /usr/lib may be hidden by files in:
/usr/local/lib
link library [libboost_filesystem.so] in /usr/lib may be hidden by files in:
/usr/local/lib
link library [libboost_thread.so] in /usr/lib may be hidden by files in:
/usr/local/lib
我之前在Ubuntu 22.04上从源码编译安装Boost后,也碰到过完全一样的问题——明明/usr/lib里的Boost库已经通过apt purge删干净了,locate也查不到任何痕迹,但CMake就是揪着旧路径不放。这大概率是缓存残留导致的,下面是几个亲测有效的解决步骤:
1. 清空CMake本地缓存(最优先尝试)
CMake会把第一次检测到的库路径、依赖信息存在项目的CMakeCache.txt和构建目录里,哪怕实际文件已经删除,它也不会自动重新扫描。解决方法很简单:
- 如果是out-of-source构建(比如用单独的
build目录),直接删掉整个构建目录:rm -rf build/ - 如果是in-source构建,删掉根目录下的
CMakeCache.txt:rm CMakeCache.txt
之后重新运行CMake,它会从头开始扫描系统里的库,应该就能识别到/usr/local/lib里的Boost了。
2. 强制CMake指定Boost路径
如果清空缓存后还是不行,可以手动告诉CMake去哪里找Boost,避免它乱跑搜索路径:
方法一:在CMakeLists.txt里添加配置
在调用find_package(Boost)之前,加上这几行:
# 强制指定Boost的安装根目录 set(Boost_ROOT /usr/local) # 指定头文件目录 set(Boost_INCLUDE_DIR /usr/local/include) # 指定库文件目录 set(Boost_LIBRARY_DIR /usr/local/lib) # 然后再查找依赖 find_package(Boost REQUIRED COMPONENTS regex program_options filesystem thread)
方法二:通过CMake命令行参数指定
运行CMake的时候直接传参数,不用改CMakeLists.txt:
cmake .. -DBoost_ROOT=/usr/local -DBoost_INCLUDE_DIR=/usr/local/include -DBoost_LIBRARY_DIR=/usr/local/lib
3. 清理pkg-config缓存
有时候系统的pkg-config工具会残留旧的Boost配置,哪怕你已经卸载了apt版本的Boost。可以检查一下:
- 先查看有没有残留的Boost配置条目:
pkg-config --list-all | grep boost - 如果能查到旧的条目,找到对应的
.pc文件(通常在/usr/lib/pkgconfig或/usr/share/pkgconfig目录下),删掉之后再更新缓存:sudo rm /usr/lib/pkgconfig/boost*.pc sudo ldconfig
4. 更新系统动态链接库缓存
系统的ldconfig缓存也可能残留旧的库路径信息,运行下面的命令检查:
sudo ldconfig -v | grep boost
如果输出里还能看到/usr/lib的Boost路径,再跑一遍sudo ldconfig强制更新缓存,或者检查/etc/ld.so.conf.d/目录下有没有旧的Boost配置文件,删掉后再执行sudo ldconfig。
备注:内容来源于stack exchange,提问作者clocksw

