我有一个使用第三方库的项目(让我们称之为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_DIRS
和somelib_LIBRARY
已正确填充,但未设置somelib_FOUND
(即使如此,find_package
也不会中止编译。)
*Config.cmake
的{{1}}是否有效?
如何设置除Find*.cmake
之外的所有变量?
如果未设置*_FOUND
,为什么find_package
REQUIRED
不会中止编译?
答案 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:注意引号