用于定义一个项目,它是 CMakeLists.txt 文件中的第一个命令,通常也是必须的命令。project 命令的主要作用是设置项目的名称,并且可以指定项目的版本和语言。
ex
project(MyProject VERSION 1.0.0 LANGUAGES CXX)
后续使用项目名MyProject时可以直接使用宏${PROJECT_NAME}替换
#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
project(MyProject VERSION 1.0)
configure_file(config.h.in config.h)
在生成 config.h 文件时,@PROJECT_VERSION_MAJOR@ 和 @PROJECT_VERSION_MINOR@ 会被替换为项目的版本号中的主要和次要版本号。
target_link_libraries 命令来指定库应该链接的其他库,使用 target_include_directories 来指定库的包含目录,以及其他用于配置目标属性的命令。add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] [...])
用于设置一个目标的属性,这些属性可以控制目标的构建行为,比如编译选项、链接选项、包含目录、输出目录等
ex
set_target_properties(MyExecutable PROPERTIES
OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
COMPILE_FLAGS "-Wall -Wextra")
在这个例子中,OUTPUT_DIRECTORY 属性被设置为构建目录下的 bin 子目录,而 COMPILE_FLAGS 属性被用来添加额外的编译器警告标志。
target_link_directories(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
...
)
add_executable() 或 add_library() 创建的。用于指定目标(如可执行文件或库)链接时需要的库。这个命令告诉 CMake 在构建一个目标时,需要链接哪些库,以及这些库的链接顺序。
在链接库时,库的顺序很重要,特别是当链接器依赖于库的依赖关系顺序时。CMake 会按照你指定的顺序将库传递给链接器。
ex
target_link_libraries(MyExecutable Qt5::Gui Qt5::Widget)
function(calculate_sum a b output)
math(EXPR sum "${a} +${b}")
set(${output}${sum} PARENT_SCOPE)
endfunction()
# 调用自定义函数并获取返回值
calculate_sum(5 3 result)
message(STATUS "The sum is: ${result}")
在这个例子中,calculate_sum 函数接受两个输入参数 a 和 b,以及一个输出参数 output。函数内部使用 math(EXPR) 命令计算两数之和,并使用 set 命令将结果存储在 output 参数中。PARENT_SCOPE 选项确保输出参数的值在函数外部可见。