😈**「CSDN主页」** :传送门
😈**「Bilibil首页」** :传送门
😈**「本文的内容」** :CMake入门教程
😈**「动动你的小手」** :点赞 👍收藏 ⭐️评论📝
文章目录
- 1.使用方法
-
- 1.1基本用法
- 1.2导入软件包的设置:
- 1.3自定义软件包的查找路径:
- [1.4使用 Find 模块文件:](#1.4使用 Find 模块文件:)
- 1.5设置软件包的变量:
- 2.示例
-
- [2.1查找并导入 OpenCV 软件包:](#2.1查找并导入 OpenCV 软件包:)
- [2.2查找并导入 Boost 软件包的特定组件:](#2.2查找并导入 Boost 软件包的特定组件:)
- [2.3查找自定义的 Find 模块文件:](#2.3查找自定义的 Find 模块文件:)
- 3.find_package的查找目录
1.使用方法
1.1基本用法
find_package
是 CMake 中用于查找和加载外部软件包的命令。它可以用于查找已经安装在系统中的软件包,并将其相关的设置导入到 CMake 构建系统中。下面是find_package
的一些常见用法和技巧:
cmake
find_package(<package> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [COMPONENTS <components>])
<package>
是要查找的软件包的名称version
是软件包的版本号(可选)。EXACT
选项可指定要求精确的版本匹配。QUIET
选项可使命令在查找失败时不产生错误信息。MODULE
选项用于指定要查找的模块文件。REQUIRED
选项表示软件包是必需的,如果找不到将会引发错误。COMPONENTS
选项用于指定软件包的组件。
1.2导入软件包的设置:
cmake
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
if(<package>_FOUND)
include_directories(${<package>_INCLUDE_DIRS})
target_link_libraries(<target> ${<package>_LIBRARIES})
endif()
在找到软件包后,可以使用
${<package>_INCLUDE_DIRS}
和${<package>_LIBRARIES}
变量来导入软件包的头文件路径和库文件路径,并将其添加到相应的构建目标中。
1.3自定义软件包的查找路径:
cmake
set(<package>_DIR <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
可以使用
set(<package>_DIR <path>)
命令来设置软件包的查找路径,其中<path>
是软件包的安装路径。这样,find_package
命令将会在指定的路径下查找软件包。
1.4使用 Find 模块文件:
cmake
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
可以使用
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} <path>)
命令将自定义的 Find 模块文件所在的路径添加到 CMake 模块搜索路径中。然后,find_package
命令将会在指定的路径下查找模块文件。
1.5设置软件包的变量:
cmake
set(<package>_DIR <path>)
find_package(<package> [version] [EXACT] [REQUIRED] [COMPONENTS <components>])
if(<package>_FOUND)
message("Found <package>: ${<package>_VERSION}")
endif()
在找到软件包后,可以使用
${<package>_VERSION}
变量来获取软件包的版本信息,并进行相应的处理。
2.示例
2.1查找并导入 OpenCV 软件包:
cmake
find_package(OpenCV 4.2.0 REQUIRED)
if(OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(my_project ${OpenCV_LIBRARIES})
endif()
在此示例中,我们使用
find_package
命令来查找 OpenCV 软件包,并指定所需的最低版本为 4.2.0。如果找到了 OpenCV,我们将导入其头文件路径和库文件路径,并将其链接到名为my_project
的目标中。
2.2查找并导入 Boost 软件包的特定组件:
cmake
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()
在此示例中,我们使用
find_package
命令来查找 Boost 软件包,并指定所需的最低版本为 1.75.0。我们还指定了需要的组件,即filesystem
和system
。如果找到了 Boost,并且所需的组件也可用,我们将导入其头文件路径和库文件路径,并将其链接到my_project
目标中。
2.3查找自定义的 Find 模块文件:
cmake
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()
在此示例中,我们将自定义的 Find 模块文件的路径添加到 CMake 模块搜索路径中,并使用
find_package
命令来查找名为CustomPackage
的软件包。如果找到了 CustomPackage,我们将导入其头文件路径和库文件路径,并将其链接到my_project
目标中。
3.find_package的查找目录
find_package
命令在 CMake 中用于查找和加载外部库或软件包。它按照特定的顺序在多个目录中搜索指定的软件包。这些搜索目录包括:
- CMake变量指定的路径 :
CMAKE_PREFIX_PATH
:一个或多个路径的列表,CMake会在这些路径下查找软件包。<PackageName>_DIR
:对于特定软件包,可以设置一个变量来指定其配置文件的路径(例如,对于Foo
包,设置Foo_DIR
)。
- 系统默认路径 :
- 在 Unix-like 系统上,通常包括
/usr/local
、/usr
等标准安装路径。 - 在 Windows 系统上,可能包括一些特定于 Windows 的标准路径,如程序安装目录。
- 在 Unix-like 系统上,通常包括
- 环境变量指定的路径 :
CMAKE_SYSTEM_PREFIX_PATH
:系统环境变量指定的路径列表,例如在 Unix 系统上可能包括/usr/local/
等。- 其他特定于系统的环境变量,如
LD_LIBRARY_PATH
或PATH
。
- CMake模块路径 :
CMAKE_MODULE_PATH
:这个变量可以用来指定自定义的"Find模块"的路径。通过将自定义模块路径添加到这个变量,可以让find_package
使用这些自定义模块来查找软件包。
- 预定义的CMake模块 :
- CMake还包含了一组预定义的模块,这些模块定义了常用软件包的查找逻辑。这些模块通常位于 CMake 安装目录的
Modules
子目录中。
- CMake还包含了一组预定义的模块,这些模块定义了常用软件包的查找逻辑。这些模块通常位于 CMake 安装目录的
find_package
首先尝试使用配置模式(即查找软件包提供的配置文件,如FooConfig.cmake
或foo-config.cmake
),如果失败,则回退到模块模式(使用 CMake 提供或自定义的 Find 模块,如FindFoo.cmake
)。
正确设置这些路径可以确保 CMake 能够在预期的位置找到所需的软件包
CMAKE_PREFIX_PATH _DIR Unix-like系统 Windows系统 CMAKE_SYSTEM_PREFIX_PATH LD_LIBRARY_PATH, PATH等 CMAKE_MODULE_PATH 开始find_package搜索 检查CMake变量 路径列表 特定软件包路径 系统默认路径 /usr/local, /usr等 特定于Windows的路径 环境变量指定路径 系统环境变量路径列表 其他系统环境变量 CMake模块路径 自定义Find模块路径 预定义CMake模块 CMake安装目录的Modules子目录