2

Cmake 包括各种分发模块(即,填充在Modules/cmake 安装目录中;例如,/usr/share/cmake-3.5/Modules/FindBoost.cmake)。

在开发包含名称与这些分发模块冲突的内部库的代码时,这会带来挑战,因为会find_package(Xyz)找到分发模块 ( /usr/share/cmake-3.5/Modules/FindXyz.cmake) 而不是用户模块 ( /home/user/opt/lib/cmake/Xyz-config.cmake)。我尝试设置CMAKE_FIND_ROOT_PATHand CMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY,但无济于事。

如何在评估时强制 cmake 排除其自己的分发模块find_package()

4

1 回答 1

2

作为项目的作者,您可能会发现“旧版”查找脚本 ( FindXXX.cmake) 不适合您,并且更喜欢使用“现代”配置脚本 (XXXConfig.cmakeconfig-xxx.cmake)。在这种情况下,您可以将附加CONFIGNO_MODULE选项传递给find_package

find_package(Boost NO_MODULE)

这将阻止 CMake 搜索FindBoost.cmake脚本并强制它搜索BoostConfig.cmake(或config-boost.cmake)。

如果使用or选项找不到配置脚本,即使存在相应的查找脚本,CMake 也会报错。NO_MODULECONFIG

或者,您可以设置CMAKE_FIND_PACKAGE_PREFER_CONFIG变量:

set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)

所以 CMake 会先检查配置脚本。但是如果缺少这个脚本,那么 CMake 会尝试使用find脚本。


作为项目的用户,您可能会发现某些包的配置脚本比find更好......但在这种情况下最好什么都不做:您正在使用的项目可能只能与find脚本一起使用,并且不能使用配置一。(例如,项目使用由find脚本创建的变量来引用库,但配置脚本通常会创建 IMPORTED目标)。

于 2020-12-09T22:59:46.213 回答