CMake入门教程【核心篇】查找包(find_package)-LMLPHP


1.使用方法

1.1基本用法

find_package(<package> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [COMPONENTS <components>])

1.2导入软件包的设置:

find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
if(<package>_FOUND)
    include_directories(${<package>_INCLUDE_DIRS})
    target_link_libraries(<target> ${<package>_LIBRARIES})
endif()

1.3自定义软件包的查找路径:

set(<package>_DIR <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])

1.4使用 Find 模块文件:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])

1.5设置软件包的变量:

set(<package>_DIR <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
if(<package>_FOUND)
    message("Found <package>: ${<package>_VERSION}")
endif()

2.示例

2.1查找并导入 OpenCV 软件包:

find_package(OpenCV 4.2.0 REQUIRED)
if(OpenCV_FOUND)
    include_directories(${OpenCV_INCLUDE_DIRS})
    target_link_libraries(my_project ${OpenCV_LIBRARIES})
endif()

2.2查找并导入 Boost 软件包的特定组件:

find_package(Boost 1.75.0 REQUIRED COMPONENTS filesystem system)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(my_project ${Boost_LIBRARIES})
endif()

2.3查找自定义的 Find 模块文件:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} /path/to/FindCustomPackage.cmake)
find_package(CustomPackage REQUIRED)
if(CustomPackage_FOUND)
    include_directories(${CustomPackage_INCLUDE_DIRS})
    target_link_libraries(my_project ${CustomPackage_LIBRARIES})
endif()

3.find_package的查找目录

find_package 命令在 CMake 中用于查找和加载外部库或软件包。它按照特定的顺序在多个目录中搜索指定的软件包。这些搜索目录包括:

  1. CMake变量指定的路径
    • CMAKE_PREFIX_PATH:一个或多个路径的列表,CMake会在这些路径下查找软件包。
    • <PackageName>_DIR:对于特定软件包,可以设置一个变量来指定其配置文件的路径(例如,对于Foo包,设置Foo_DIR)。
  2. 系统默认路径
    • 在 Unix-like 系统上,通常包括 /usr/local/usr 等标准安装路径。
    • 在 Windows 系统上,可能包括一些特定于 Windows 的标准路径,如程序安装目录。
  3. 环境变量指定的路径
    • CMAKE_SYSTEM_PREFIX_PATH:系统环境变量指定的路径列表,例如在 Unix 系统上可能包括/usr/local/等。
    • 其他特定于系统的环境变量,如LD_LIBRARY_PATHPATH
  4. CMake模块路径
    • CMAKE_MODULE_PATH:这个变量可以用来指定自定义的“Find模块”的路径。通过将自定义模块路径添加到这个变量,可以让find_package使用这些自定义模块来查找软件包。
  5. 预定义的CMake模块
    • CMake还包含了一组预定义的模块,这些模块定义了常用软件包的查找逻辑。这些模块通常位于 CMake 安装目录的Modules子目录中。

find_package 首先尝试使用配置模式(即查找软件包提供的配置文件,如FooConfig.cmakefoo-config.cmake),如果失败,则回退到模块模式(使用 CMake 提供或自定义的 Find 模块,如FindFoo.cmake)。

正确设置这些路径可以确保 CMake 能够在预期的位置找到所需的软件包

01-04 19:35