CMake找到包文件,配置文件是如何使用的?

Chr*_*ger 3 cmake

我有一个使用第三方库(我们称之为somelib)的项目,我为其编写了一个 cmake 文件来搜索它。

这是somelibConfig.cmake我编写并放入的文件/usr/local/lib/cmake/somelib/

FIND_LIBRARY(somelib_LIBRARY somelib
    PATHS /usr/local/lib
    NO_DEFAULT_PATH
)
SET(somelib_LIBRARIES ${somelib_LIBRARY})
FIND_PATH(somelib_INCLUDE_DIR somelib.hpp
    PATHS /usr/local/include/somelib
    NO_DEFAULT_PATH
)
SET(somelib_INCLUDE_DIRS ${somelib_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

然后,如果我find_package(somelib REQUIRED)这样做,效果就很好。

但是,如果我移动并重命名somelibConfig.cmakemyproject/CMakeModules/Findsomelib.cmake(此目录被添加到CMAKE_MODULE_PATH),在find_package我看到变量somelib_INCLUDE_DIRSsomelib_LIBRARY已正确填充后,但未somelib_FOUND设置(即使如此,find_package也不会中止编译)。

*Config.cmake对于 a 有效吗Find*.cmake

怎么可能除了这个变量之外的所有变量都*_FOUND被设置了呢?

如果未设置,为什么不find_package中止REQUIRED编译?*_FOUND

ste*_*ire 5

配置文件和查找模块有根本的不同。

http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html

只有 somelib 的开发人员会提供配置文件(如果他们这样做的话)。如果没有,那么您需要编写一个查找模块来查找某个lib。这样的查找模块不应像您那样复制到 /usr/local 。只需将其保留在您的项目中,并要求 somelib 开发人员提供一个配置文件即可。上游提供的配置文件优于您编写的查找模块。如果上游 somelib 不使用 cmake 也没关系。使用非 cmake 构建系统时,Qt 和 LLVM 都会附带配置文件。

自卑的一个例子是,在编写 find-module 时,您需要设置 _FOUND 变量。有关编写 find-modules 的更多信息如下:

http://www.cmake.org/cmake/help/v3.0/manual/cmake-developer.7.html#manual:cmake-developer%287%29