cmake 学习笔记(三)

接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用。

学习一下cmake的 finder。


当编译一个需要使用第三方库的软件时,我们需要知道:

去哪儿找头文件 .h 对比GCC的 -I 参数
去哪儿找库文件 (.so/.dll/.lib/.dylib/...) 对比GCC的 -L 参数
需要链接的库文件的名字 对比GCC的 -l 参数

这也是一个 finder 需要返回的最基本的信息。


比如说,我们需要一个第三方库 curl,那么我们的 CMakeLists.txt 需要指定头文件目录,和库文件,类似:

include_directiories(/usr/include)
target_link_libraries(myprogram curl)

如果借助于cmake提供的finder会怎么样呢?使用cmake的Modules目录下的FindCURL.cmake,相应的 CMakeList.txt 文件:

find_package(CURL REQUIRED)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})

或者

find_package(CURL)
if(CURL_FOUND)
include_directories(${CURL_INCLUDE_DIR})
target_link_libraries(curltest ${CURL_LIBRARY})
else(CURL_FOUND)
message(FATAL_ERROR "curl not found!")
endif(CURL_FOUND)

如果我们使用的finder,不是cmake自带的怎么办?

  • 放置位置:工程根目录下的 cmake/Modules/
  • 然后在 CMakeList.txt 中添加
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")


find_package 将会在module路径下查找 Find.cmake。首先它搜索 ${CMAKE_MODULE_PATH}中的所有路径,然后搜索 /share/cmake-x.y/Modules/

如果这个文件未找到,它将会查找 Config.cmake 或 -config.cmake 文件。这两个文件是库文件安装时自己安装的,将自己的路径硬编码到其中。

前者称为 module 模式,后者称为 config 模式

每个模块一般都会提供一下几个变量

  • _FOUND

  • _INCLUDE_DIR 或 _INCLUDES

  • _LIBRARY 或 _LIBRARIES 或 _LIBS

  • _DEFINITIONS


  • 首先使用 find_package 探测本软件包依赖的第三方库(参数 QUIETLY 和 REQUIRED应该被传递)

  • 如果 pkg-config 可用,则可以用其去探测include/library路径

  • 分别使用 find_path 和 find_library 查找头文件和库文件

    • pkg-config 提供的路径仅作为参考
    • CMake 有很多硬编码的路径
    • 结果放到 _INCLUDE_DIR 和 _LIBRARY (注意:单数而不是复数)
  • 设置 _INCLUDE_DIRS 为 _INCLUDE_DIR _INCLUDE_DIRS ...

  • 设置 _LIBRARIES 为 _LIBRARY _LIBRARIES ...

    • 依赖使用复数,包自身使用单数形式(由find_path和find_library提供)
  • 调用宏 find_package_handle_standard_args() 设置 _FOUND 并打印或失败信息


  • http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries

  • http://www.cmake.org/cmake/help/cmake-2-8-docs.html

你可能感兴趣的:(cmake 学习笔记(三))