在CMake中,常用的指令对于定义项目的构建过程至关重要。以下是一些常用的CMake指令的详细解释:
cmake_minimum_required
作用:指定构建该项目所需的CMake最低版本。
语法:
cmake_minimum_required(VERSION major.minor [PATCH [min_policy_version]])
VERSION
后跟的是所需的CMake版本号。PATCH
和 min_policy_version
是可选的,用于更精细地控制版本要求。project
作用:设置项目的名称和版本(可选),并初始化一些变量。
语法:
project(PROJECTNAME [VERSION major.minor.patch [LANGUAGES]])
PROJECTNAME
是项目的名称。VERSION
后跟的是项目的版本号,是可选的。LANGUAGES
指定项目使用的编程语言,也是可选的,如果不指定,则默认支持所有语言。set
作用:设置变量的值。
语法:
set(VAR value [CACHE TYPE DOCSTRING [FORCE]])
VAR
是要设置的变量名。value
是变量的值。CACHE
选项用于将变量存储在CMake缓存中,以便在多次构建之间保持值不变。TYPE
、DOCSTRING
和 FORCE
是与缓存变量相关的选项。add_executable
作用:添加一个可执行文件目标。
语法:
add_executable(name [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
name
是可执行文件的名称。[WIN32]
、[MACOSX_BUNDLE]
和 [EXCLUDE_FROM_ALL]
是可选的参数,用于指定特定的构建选项。source1 source2 ... sourceN
是构成可执行文件的源文件列表。add_library
作用:添加一个库目标。
语法:
add_library(name [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
name
是库的名称。[STATIC | SHARED | MODULE]
指定库的类型,默认为STATIC。[EXCLUDE_FROM_ALL]
是可选的,表示该库不会被默认构建。source1 source2 ... sourceN
是构成库的源文件列表。target_link_libraries
作用:为目标添加需要链接的库。
语法:
target_link_libraries(target item1 [item2 ...])
target
是要链接库的目标名称。
指定链接的可见性。item1 [item2 ...]
是要链接的库或目标列表。target_include_directories
作用:为目标添加包含目录。
语法:
target_include_directories(target dir1 [dir2 ...])
target
是要添加包含目录的目标名称。
指定包含目录的可见性。dir1 [dir2 ...]
是要添加的包含目录列表。include_directories
作用:向项目添加全局包含目录。
注意:虽然include_directories
仍然可用,但推荐使用target_include_directories
来替代,因为它提供了更好的作用域控制。
语法:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
[AFTER|BEFORE]
指定包含目录的添加顺序(相对于其他包含目录)。[SYSTEM]
表示这些目录是系统目录,CMake会相应地处理它们。dir1 [dir2 ...]
是要添加的全局包含目录列表。find_package
作用:查找并加载指定的外部项目。
语法:
find_package(PackageName [version] [EXACT] [REQUIRED|QUIET|MODULE] [...])
PackageName
是要查找的外部项目的名称。[version]
是指定查找的版本号。[EXACT]
表示版本号必须完全匹配。[REQUIRED|QUIET|MODULE]
是控制查找行为的选项:[REQUIRED]
表示如果找不到包,则CMake会报错并停止配置过程。[QUIET]
表示在找不到包时,不会输出任何消息。[MODULE]
表明CMake将仅查找模块模式的包。find_package
会设置一些变量,这些变量通常包含找到的包的路径、头文件位置、库文件等,以便在项目中使用。
add_subdirectory
作用:向当前项目添加另一个子项目。
语法:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
source_dir
是子项目的源代码目录。[binary_dir]
是可选的,指定构建输出的目录。[EXCLUDE_FROM_ALL]
表示该子项目不会被默认构建,除非有其他组件依赖或手动构建。add_definitions
注意:虽然add_definitions
在某些情况下仍然有用,但现代CMake项目更倾向于使用target_compile_definitions
来为目标添加编译定义,因为它提供了更好的作用域控制。
作用:向编译器添加全局编译定义(即-D宏定义)。
语法:
add_definitions(-DMACRO1 -DMACRO2=value)
-DMACRO1
添加了一个名为MACRO1
的编译定义。-DMACRO2=value
添加了一个名为MACRO2
的编译定义,并将其值设置为value
。option
作用:在CMake中定义一个开关选项,类似于CMake变量,但具有ON/OFF的布尔值。
语法:
option(VARIABLE_NAME "help string describing this option" [initial value])
VARIABLE_NAME
是选项的名称,同时也是CMake变量的名称。"help string describing this option"
是对该选项的描述。[initial value]
是该选项的初始值,默认为OFF。configure_file
作用:将文件内容中的变量替换为它们的值,并将结果写入到另一个文件中。这通常用于配置文件或版本文件的生成。
语法:
configure_file(
是输入文件的路径。
是输出文件的路径。install
在软件开发中,构建软件只是第一步,将软件及其必要的组件安装到用户的系统或指定位置以供使用,是开发周期中的一个关键环节。install
指令允许开发者指定安装哪些文件、安装到哪些位置以及如何进行安装,这对于创建可分发和可部署的软件包至关重要。
install
指令的基本语法如下:
install([TARGETS ...]
[RUNTIME DESTINATION ]
[LIBRARY DESTINATION ]
[ARCHIVE DESTINATION ]
[FRAMEWORK DESTINATION ]
[BUNDLE DESTINATION ]
[FILES ...]
[PROGRAMS ...]
[DIRECTORY ...]
[SCRIPT ...]
[CODE ...]
[COMPONENT ]
[OPTIONAL] [...])
这个指令非常灵活,可以安装多种类型的文件,包括:
TARGETS:指定要安装的构建目标(如可执行文件、库)。
RUNTIME DESTINATION
:指定运行时文件(如可执行文件)的安装目录。LIBRARY DESTINATION
:指定库文件的安装目录。ARCHIVE DESTINATION
:指定静态库(如.a、.lib)的安装目录(注意:在某些系统上,静态库和共享库可能安装在同一目录下)。DESTINATION
选项用于特定类型的目标,如框架(FRAMEWORK DESTINATION
)或应用程序包(BUNDLE DESTINATION
)。FILES:直接指定要安装的文件列表。
PROGRAMS:与 FILES
类似,但通常用于安装可执行脚本或程序。
DIRECTORY:安装整个目录及其内容。
SCRIPT:在安装过程中执行 CMake 脚本。
CODE:在安装过程中执行 CMake 代码块。
示例: 假设你有一个名为 MyApplication
的可执行文件和一个名为 MyLibrary
的共享库,你想要将它们安装到用户的系统中,你可以这样写:
install(TARGETS MyApplication MyLibrary
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
这个命令会安装 MyApplication
到 bin
目录(通常是可执行文件的安装位置),并将 MyLibrary
的共享库版本安装到 lib
目录,假设你还有一个静态库版本,你可以将其安装到 lib/static
目录。