CMake硬编码路径可找到OpenMP,计算路径为何失效?
系统信息
- macOS 12.5.1
- 编译器:Apple clang 14.0.0
- CMake版本:3.24.2(通过brew安装)
- OpenMP版本:15.0.7(通过brew安装,路径为
/opt/homebrew/opt/libomp/)
问题描述
我在调试CMake无法找到OpenMP的异常问题,做了三次尝试:
- 尝试1:直接在CMakeLists.txt中调用
find_package(OpenMP REQUIRED),执行rm -rf * && cmake ..时提示找不到OpenMP_C。 - 尝试2:通过
execute_process调用brew --prefix libomp获取OpenMP路径,将其添加到CMAKE_PREFIX_PATH后再执行查找,仍出现相同错误,但日志显示路径已正确获取。 - 尝试3:硬编码相同路径到
CMAKE_PREFIX_PATH,则能成功找到OpenMP。
请问是否存在隐形引号问题或其他可能的原因?
问题分析与解决
最可能的原因:execute_process输出带换行符
brew --prefix libomp的输出会自带换行符,用execute_process直接获取结果时,这个换行符会被保留在路径变量里。CMake识别路径时会把带换行的路径判定为无效,表面看路径正确,实际无法被解析。
解决方法:在execute_process中添加OUTPUT_STRIP_TRAILING_WHITESPACE参数,去掉输出末尾的空白符(包括换行):
execute_process( COMMAND brew --prefix libomp OUTPUT_VARIABLE LIBOMP_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE ) list(APPEND CMAKE_PREFIX_PATH ${LIBOMP_PREFIX}) find_package(OpenMP REQUIRED)
其他可能原因
- 路径设置时机过晚:如果
execute_process和路径添加的代码放在project()命令之后,可能已经错过了CMake初始化依赖查找的时机。需要确保在project()之前就完成CMAKE_PREFIX_PATH的设置。 - 环境变量干扰:检查是否存在
OMP_ROOT、OpenMP_ROOT这类环境变量设置错误,导致CMake优先查找错误路径。可以在执行cmake前临时清空这些变量:unset OMP_ROOT && unset OpenMP_ROOT && cmake .. - 缓存残留问题:旧的CMake缓存可能残留错误配置,即使修改了CMakeLists.txt也无效。执行
rm -rf CMakeCache.txt CMakeFiles/后再重新运行cmake,清除缓存干扰。
内容的提问来源于stack exchange,提问作者oarfish
相关产品推荐
相关产品推荐

