能否让CMake的find_package在MODULE模式下采用CONFIG模式搜索流程查找OpenVDB?
解决方案:让MODULE模式覆盖CONFIG风格的搜索路径
CMake本身没有原生选项让find_package的MODULE模式直接复用CONFIG模式的完整搜索流程,但可以通过以下几种变通方法实现类似效果:
手动扩展CMAKE_MODULE_PATH
直接把OpenVDB的CMake文件所在目录添加到CMAKE_MODULE_PATH中,之后再用MODULE模式查找:# 替换为你的OpenVDB安装路径下的cmake目录 list(APPEND CMAKE_MODULE_PATH "/usr/local/openvdb/cmake") find_package(OpenVDB MODULE REQUIRED)如果不确定具体路径,也可以借助环境变量(比如
OPENVDB_ROOT)来动态获取:if(DEFINED ENV{OPENVDB_ROOT}) list(APPEND CMAKE_MODULE_PATH "$ENV{OPENVDB_ROOT}/cmake") endif() find_package(OpenVDB MODULE REQUIRED)复用CMAKE_PREFIX_PATH扩展搜索范围
CONFIG模式会自动遍历CMAKE_PREFIX_PATH下的标准子目录,我们可以把这些路径同步到CMAKE_MODULE_PATH中,让MODULE模式也能搜到:# 遍历CMAKE_PREFIX_PATH,将每个路径下的cmake子目录加入搜索 foreach(prefix ${CMAKE_PREFIX_PATH}) list(APPEND CMAKE_MODULE_PATH "${prefix}/cmake") endforeach() find_package(OpenVDB MODULE REQUIRED)这种方法适合OpenVDB安装在标准前缀路径下的场景,不用硬编码具体路径。
自定义Find脚本的搜索逻辑
复制一份OpenVDB提供的FindOpenVDB.cmake到你自己项目的cmake目录,修改脚本中的路径搜索逻辑,让它按照CONFIG模式的规则去检查系统标准路径、CMAKE_PREFIX_PATH等位置,这样即使外部的Find脚本路径变化,也不影响你的项目查找。
内容的提问来源于stack exchange,提问作者Ton van den Heuvel
相关产品推荐
相关产品推荐

