本文参考:“轻松搞定CMake”系列之find_package用法详解
原理
find_package 即在指定目录CMAKE_MODULE_PATH 或 CMAKE_PREFIX_PATH查找对应的cmake文件。
find 模式
- Module模式(默认):查询Findxxx.cmake配置文件, 在CMAKE_MODULE_PATH目录
- Config模式(默认):查询xxxConfig.cmakeor<lower-case-package-name>-config.cmake配置文件,在xxx_DIR或CMAKE_PREFIX_PATH目录
如果Module模式失败则自动转入Config模式。如果Config失败,则find_package 失败。
Config模式路径查找顺序
- 名为<PackageName>_DIR的CMake变量或环境变量路径(默认为空)
- 名为CMAKE_PREFIX_PATH、CMAKE_FRAMEWORK_PATH、CMAKE_APPBUNDLE_PATH的CMake变量或环境变量路径
- PATH环境变量路径
findxxx.cmake配置文件大众规则(规则、变量自定义)
xxx_FOUND:BOOL 类型,如果成功则为true
 xxx_INCLUDES: 模块的头文件位置
 xxx_LIBRARIES:库文件位置
demo展示(add)
findadd.cmake or addConfig.cmake
message("Find add:"  $ENV{path})
message("PROJECT_SOURCE_DIR:"${PROJECT_SOURCE_DIR})
#find headers
find_path(add_INCLUDESNAMES add.h PATHS ${PROJECT_SOURCE_DIR}/add ${PROJECT_SOURCE_DIR}/add1)#find lib
find_library(add_LIBRARIES NAMES add.libPATHS ${PROJECT_SOURCE_DIR}/add/lib ${PROJECT_SOURCE_DIR}/add1/lib)message("add_INCLUDES="${add_INCLUDES})
message("add_LIBRARIES="${add_LIBRARIES})if(add_LIBRARIES AND add_LIBRARIES)set(add_FOUND TRUE)
endif()message("add_FOUND:"${add_FOUND})
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)project(mylib)#module 模式
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/)#config模式
set(add_DIR ${PROJECT_SOURCE_DIR}/cmake/)
message("CMAKE_MODULE_PATH=" ${CMAKE_MODULE_PATH})
find_package(add)if(add_FOUND)
message("add package find")
else(add_FOUND)
message("add package not find")
endif(add_FOUND)
结果展示
