cmake升级及多版本管理
-
查看原有的cmake:
cmake --version which cmake >>> /usr/bin/cmake
-
下载要装的cmake源文件,解压并进入,使用已有的cmake安装
mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local/cmake/cmake-3.20.6 .. # 或不使用cmake安装,将bootstrap中的cmake_default_prefix="/usr/local"改为cmake_default_prefix="/usr/local/cmake/cmake-3.20.6" make sudo make install cmake --version
-
.bashrc
中指定cmake版本export PATH=/usr/local/cmake/cmake-3.20.6/bin:$PATH
链接cmake
sudo ln -sf /usr/local/cmake/cmake-3.20.5/bin/* /usr/bin/
CMake常用变量
变量 | 值 |
---|---|
CMAKE_SOURCE_DIR | 工程最顶层CMakeLists.txt文件所在目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前编译的CMakeLists.txt文件所在目录 |
PROJECT_SOURCE_DIR | 当前工程的CMakeLists.txt文件所在目录 |
<PROJECT-NAME>_SOURCE_DIR | 工程中PROJECT-NAME工程的CMakeLists.txt文件所在目录 |
CMake常用命令速查
cmake命令可分为脚本命令、项目命令、CTest 命令、已弃用的命令
1. 脚本命令
脚本命令始终可用。
1.1 find_package
用于查找和加载外部库
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER])
参数 |
|
---|---|
<PackageName> | 要查找的库的名称,例如Qt、Boost、OpenCV等。 |
[version] | 可选参数,默认用于指定所需的库的最低版本。可以使用EXACT 关键字来强制匹配特定版本。 |
[EXACT] | 可选参数,用于强制匹配特定版本的库。 |
[QUIET] | 可选参数,用于在查找过程中禁止显示详细信息。 |
[MODULE] | 可选参数,用于指示查找的是CMake模块而不是包。 |
[REQUIRED] | 可选参数,用于指示库是必需的。如果找不到库,CMake将报错退出。 |
[[COMPONENTS] [components...]] | 可选参数,用于指定库的组件。例如,Qt库的组件可以是Widgets、Network、Quick等。 |
[OPTIONAL_COMPONENTS components...] | 可选参数,用于指定可选的库组件。 |
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)] | 可选参数,用于指定注册表视图。 |
[GLOBAL] | 可选参数,用于指示全局查找。 |
[NO_POLICY_SCOPE] | 可选参数,用于指示不使用策略作用域。 |
[BYPASS_PROVIDER] | 可选参数,用于绕过提供者。 |
1.2 find_library
用于查找和加载库文件
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[VALIDATOR function]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
参数 |
|
---|---|
<VAR> | 用于保存命令执行结果的变量名。 |
name | NAMES name1 [name2 ...] [NAMES_PER_DIR] | 要查找的库文件名或多个可能的文件名。NAMES_PER_DIR 表示在每个目录中查找所有指定的文件名。 |
[HINTS [path | ENV var]...] | 指定额外的搜索路径,可以是目录路径或环境变量。 |
[PATHS [path | ENV var]...] | 指定搜索路径,优先级高于默认路径。 |
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)] | 指定在Windows平台上查询注册表的视图。 |
[PATH_SUFFIXES suffix1 [suffix2 ...]] | 指定在每个目录位置下要检查的附加子目录。 |
[VALIDATOR function] | 指定一个函数,用于验证每个候选项。 |
[DOC "cache documentation string"] | 用于设置缓存文档字符串。 |
[NO_CACHE] | 禁用缓存。 |
[REQUIRED] | 指示文件是必需的。 |
[NO_DEFAULT_PATH] | 不使用默认路径。 |
[NO_PACKAGE_ROOT_PATH] | 不使用包根路径。 |
[NO_CMAKE_PATH] | 不使用CMake路径。 |
[NO_CMAKE_ENVIRONMENT_PATH] | 不使用环境变量路径。 |
[NO_SYSTEM_ENVIRONMENT_PATH] | 不使用系统环境变量路径。 |
[NO_CMAKE_SYSTEM_PATH] | 不使用CMake系统路径。 |
[NO_CMAKE_INSTALL_PREFIX] | 不使用CMake安装前缀。 |
[CMAKE_FIND_ROOT_PATH_BOTH | ONLY_CMAKE_FIND_ROOT_PATH | NO_CMAKE_FIND_ROOT_PATH] | 设置根路径模式。 |
1.3 find_path
用于查找包含特定文件的目录路径
find_path (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[VALIDATOR function]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
参数 |
|
---|---|
<VAR> | 用于保存命令执行结果的变量名。 |
name | NAMES name1 [name2 ...] | 要查找的文件名或多个可能的文件名。 |
[HINTS [path | ENV var]...] | 指定额外的搜索路径,可以是目录路径或环境变量。 |
[PATHS [path | ENV var]...] | 指定搜索路径,优先级高于默认路径。 |
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)] | 指定在Windows平台上查询注册表的视图。 |
[PATH_SUFFIXES suffix1 [suffix2 ...]] | 指定在每个目录位置下要检查的附加子目录。 |
[VALIDATOR function] | 指定一个函数,用于验证每个候选项。 |
[DOC "cache documentation string"] | 用于设置缓存文档字符串。 |
[NO_CACHE] | 禁用缓存。 |
[REQUIRED] | 指示文件是必需的。 |
[NO_DEFAULT_PATH] | 不使用默认路径。 |
[NO_PACKAGE_ROOT_PATH] | 不使用包根路径。 |
[NO_CMAKE_PATH] | 不使用CMake路径。 |
[NO_CMAKE_ENVIRONMENT_PATH] | 不使用环境变量路径。 |
[NO_SYSTEM_ENVIRONMENT_PATH] | 不使用系统环境变量路径。 |
[NO_CMAKE_SYSTEM_PATH] | 不使用CMake系统路径。 |
[NO_CMAKE_INSTALL_PREFIX] | 不使用CMake安装前缀。 |
[CMAKE_FIND_ROOT_PATH_BOTH | ONLY_CMAKE_FIND_ROOT_PATH | NO_CMAKE_FIND_ROOT_PATH] | 设置根路径模式。 |
1.4 list
用于处理列表,包括读取、搜索、修改和排序
读取 | 描述 |
---|---|
list(LENGTH <list> <out-var>) | 获取列表的长度,并将结果存储在变量中。 |
list(GET <list> <element index> [<index> ...] <out-var>) | 获取列表中指定索引位置的元素,并将结果存储在变量中。 |
list(JOIN <list> <glue> <out-var>) | 将列表中的元素用指定的分隔符连接起来,并将结果存储在变量中。 |
list(SUBLIST <list> <begin> <length> <out-var>) | 获取列表的子列表,从指定的索引开始,指定长度,并将结果存储在变量中。 |
搜索 | 描述 |
---|---|
list(FIND <list> <value> <out-var>) | 在列表中搜索指定的值,并将其索引存储在变量中。 |
修改 |
|
---|---|
list(APPEND <list> [<element>...]) | 将元素添加到列表的末尾。 |
list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>) | 根据正则表达式筛选列表中的元素。 |
list(INSERT <list> <index> [<element>...]) | 在指定索引位置插入元素到列表中。 |
list(POP_BACK <list> [<out-var>...]) | 从列表的末尾弹出元素。 |
list(POP_FRONT <list> [<out-var>...]) | 从列表的开头弹出元素。 |
list(PREPEND <list> [<element>...]) | 将元素添加到列表的开头。 |
list(REMOVE_ITEM <list> <value>...) | 从列表中移除指定的值。 |
list(REMOVE_AT <list> <index>...) | 从列表中移除指定索引位置的元素。 |
list(REMOVE_DUPLICATES <list>) | 移除列表中的重复元素。 |
list(TRANSFORM <list> <ACTION> [...]) | 对列表中的元素进行转换操作。 |
排序 |
|
---|---|
list(REVERSE <list>) | 反转列表中的元素顺序。 |
list(SORT <list> [...]) | 对列表中的元素进行排序。 |
1.5 include
用于在CMake脚本中包含其他文件或模块。
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>]
[NO_POLICY_SCOPE])
参数 |
|
---|---|
<file|module> | 要包含的文件或模块的名称。 |
[OPTIONAL] | 可选参数,表示如果文件不存在也不会报错。 |
[RESULT_VARIABLE <var>] | 可选参数,用于将结果存储在变量中。 |
[NO_POLICY_SCOPE] | 可选参数,用于指示不使用策略作用域。 |
2. 项目命令
项目命令仅在项目中可用。
2.1 include_directories
用于向编译器提供一组包含目录。
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
参数 |
|
---|---|
[AFTER|BEFORE] | 可选参数,用于指定包含目录的添加位置。AFTER 表示在已有目录之后添加,BEFORE 表示在已有目录之前添加。 |
[SYSTEM] | 可选参数,用于指示这些目录是系统级别的,而不是项目级别的。 |
dir1 [dir2 ...] | 要添加到包含路径的目录列表。 |
请根据您的项目需求使用这些参数来设置包含目录。
2.2 link_directories
用于向链接器提供一组库文件搜索路径。
link_directories([AFTER|BEFORE] directory1 [directory2 ...])
参数 | 描述 |
---|---|
[AFTER|BEFORE] | 可选参数,用于指定链接路径的添加位置。AFTER 表示在已有路径之后添加,BEFORE 表示在已有路径之前添加。 |
directory1 [directory2 ...] | 要添加到链接路径的目录列表。 |
2.3 target_include_directories
用于为指定目标(target)添加头文件搜索路径
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
参数 | 描述 |
---|---|
<target> | 要添加头文件搜索路径的目标的名称。 |
[SYSTEM] | 可选参数,用于指示这些路径是系统级别的,而不是项目级别的。 |
[AFTER|BEFORE] | 可选参数,用于指定添加路径的位置。AFTER 表示在已有路径之后添加,BEFORE 表示在已有路径之前添加。 |
<INTERFACE|PUBLIC|PRIVATE> | 指定添加路径的属性。 |
[items1...] | 要添加的头文件搜索路径列表。 |
[items2...] | 可选参数,用于添加更多的头文件搜索路径。 |
2.4 link_libraries
用于指定要链接到整个项目的库
link_libraries([item1 [item2 [...]]]
[[debug|optimized|general] <item>] ...)
2.5 target_link_libraries
用于将库链接到指定的目标(target)
target_link_libraries(<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
参数 |
|
---|---|
<target> | 要链接的目标的名称。 |
<PRIVATE|PUBLIC|INTERFACE> | 指定链接的属性: PRIVATE - 链接的库只对当前目标有效。 不会传递给依赖于当前目标的其他目标。 PUBLIC - 链接的库对当前目标和依赖于当前目标的其他目标都有效。 会传递给其他目标。 INTERFACE - 链接的库只对依赖于当前目标的其他目标有效。 不会传递给当前目标。 |
<item>... | 要链接的库或目标的名称。 |
2.6 include_directories、link_directories、link_libraries与target_include_directories的区别与联系
命令 | 描述 |
---|---|
include_directories | 用于向编译器提供一组包含目录。这些目录将在预处理器查找头文件时被搜索。 |
link_directories | 用于向链接器提供一组库文件搜索路径。这些路径将在链接时查找库文件。 |
link_libraries | 用于指定要链接到目标的库。 |
target_include_directories | 用于为指定目标(target)添加头文件搜索路径。这是目标范围的设置,只影响特定目标的编译过程。 |
方面 | 区别 | 联系 |
---|---|---|
作用对象 | target_include_directories 只作用于指定的目标。 | include_directories 、link_directories 和link_libraries 作用于整个项目,影响所有目标。 |
路径类型 | link_libraries 设置的是要链接到目标的库。 | include_directories 设置的是头文件的搜索路径。 link_directories 设置的是库文件的链接路径。 target_include_directories 设置的是特定目标的头文件搜索路径。 |
2.7 add_executable
用于定义一个可执行对象
# 普通
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
# 导入
add_executable(<name> IMPORTED [GLOBAL])
# 别名
add_executable(<name> ALIAS <target>)
参数 | 描述 |
---|---|
<name> | 要创建的可执行目标的名称。 |
[WIN32] | 可选参数,用于指示在Windows上创建一个GUI应用程序。 |
[MACOSX_BUNDLE] | 可选参数,用于指示在macOS上创建一个应用程序捆绑包。 |
[EXCLUDE_FROM_ALL] | 可选参数,用于指示将目标排除在构建过程之外。 |
[source1] [source2 ...] | 源文件列表,用于构建可执行目标。 |
IMPORTED | 用于创建一个导入的目标,表示目标不由当前项目构建,而是由其他项目或外部提供。 |
ALIAS <target> | 用于创建一个目标别名,允许在构建过程中使用不同的名称引用相同的目标。 |
2.8 add_library
创建一个库
# 普通
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[<source>...])
# 对象
add_library(<name> OBJECT [<source>...])
# 接口
add_library(<name> INTERFACE)
# 导入
add_library(<name> <type> IMPORTED [GLOBAL])
# 别名
add_library(<name> ALIAS <target>)
参数 | 描述 |
---|---|
<name> | 要创建的库目标的名称。 |
[STATIC | SHARED | MODULE] | 可选参数,用于指定库的类型: - STATIC :创建一个静态库。- SHARED :创建一个共享库(动态库)。- MODULE :创建一个模块库(在某些平台上的特定类型)。 |
[EXCLUDE_FROM_ALL] | 可选参数,用于指示将目标排除在构建过程之外。 |
[<source>...] | 源文件列表,用于构建库。 |
OBJECT | 创建一个对象库目标。这是一种特殊类型的库,不会生成实际的库文件,但可以在其他目标中使用。 |
INTERFACE | 创建一个接口库目标。这是一种特殊类型的库,不会生成实际的库文件,只包含头文件和编译选项。 |
<type> IMPORTED [GLOBAL] | 创建一个导入的目标,表示目标不由当前项目构建,而是由其他项目或外部提供。<type> 为STATIC, SHARED, MODULE, UNKNOWN 其中之一 |
ALIAS <target> | 为<target> 创建一个目标别名,允许在构建过程中使用不同的名称引用相同的目标。 |
2.9 add_dependencies
使顶层目标 <target>
依赖于其他顶层目标,确保在构建 <target>
之前,其他目标已经构建完毕。
add_dependencies(<target> [<target-dependency>]...)
顶层目标是由 add_executable()
、add_library()
或 add_custom_target()
等命令创建的目标(但不包括由 CMake 生成的像 install
这样的目标)。
2.10 add_definitions
将-D定义标志添加到源文件的编译中。
add_definitions(-DFOO -DBAR ...)
向当前目录中的目标添加编译器命令行的定义,无论是在调用此命令之前还是之后添加的,以及在之后添加的子目录中的目标。此命令可用于添加任何标志,但旨在添加预处理器定义。
注意:此命令已被替代:
使用add_compile_definitions()添加预处理器定义。
使用include_directories()添加包含目录。
使用add_compile_options()添加其他选项。
2.11 install
用于在CMake构建过程中安装目标、文件、目录、脚本、代码等
install(TARGETS <target>... [...])
install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
install(RUNTIME_DEPENDENCY_SET <set-name> [...])
命令 | 描述 |
---|---|
install(TARGETS <target>... [...]) | 安装指定的构建目标(例如可执行文件、库)。 |
install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...]) | 安装导入的运行时构件。 |
install({FILES | PROGRAMS} <file>... [...]) | 安装指定的文件或程序。 |
install(DIRECTORY <dir>... [...]) | 安装指定的目录及其内容。 |
install(SCRIPT <file> [...]) | 安装指定的脚本文件。 |
install(CODE <code> [...]) | 在安装过程中执行指定的CMake代码。 |
install(EXPORT <export-name> [...]) | 安装指定的导出配置。 |
install(RUNTIME_DEPENDENCY_SET <set-name> [...]) | 安装指定的运行时依赖集。 |