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

时间:2014-09-15 18:46:11

标签: 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})

然后,如果我做find_package(somelib REQUIRED)它就可以了。

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

*Config.cmake的{​​{1}}是否有效?

如何设置除Find*.cmake之外的所有变量?

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

2 个答案:

答案 0 :(得分:2)

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

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

只有somelib的开发人员才会发送配置文件(如果有的话)。如果他们不这样做,那么你需要编写一个find-module来查找somelib。这样的find-module不应该像你一样复制到/ usr / local。只需将其与项目保持一致,并要求somelib开发人员发送配置文件。上游发送的配置文件优于查找您编写的模块。如果somelib upstream不使用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

答案 1 :(得分:1)

如果要在默认库文件夹中搜索,则参数不应包含NO_DEFAULT_PATH。

试试这个,

SET(libraryName "somelibrary.so") #in linux .a or .so
FIND_LIBRARY(LIBRARY ${libraryName}
    PATHS "/usr/local/lib/cmake/somelib/"
)
MESSAGE("library path ${LIBRARY})

如果成功,将设置LIBRARY_FOUND。

P.S:注意引号