Table of Contents

CMake

会用就行,我不想写


使用

一条命令行启动CMake的例子,展示了如何指定编译环境和一些参数,-D是Define的意思,用于设定变量的值:

cmake .. -G"MinGW Makefiles" -DCMAKE_CXX_FLAGS=-Wa,-mbig-obj -D BUILD_SHARED_LIBS=OFF

警告:以下这样传递参数其实是不安全的

-D BUILD_SHARED_LIBS=OFF

中间多了一个空格可能会导致参数识别错误,想一下程序读取参数的过程,连起来的肯定是不会错的,中间加了空格的顺序可能会错,所以结论是:除非空格是强制要求,否则不要加空格,参考一下cl编译器的参数,也是不加空格的,要适应一下这种方式

执行CMake会生成对应平台的工程文件(比如在Windows上会生成VS Solution),这一个完整的工程中会包含几个固定的Build Target(在Windows上是VS Project),分别用于不同的目的

Q:CMake生成的ALL_BUILD和INSTALL和ZERO_CHECK工程都是做什么的?

from AI
CMake是一个跨平台的构建系统,它可以自动生成各种构建工具的项目文件。当使用CMake生成一个项目时,通常会生成以下三个工程文件:
1. ALL_BUILD:ALL_BUILD工程是一个用于构建整个项目的工程,它包含了所有项目的构建目标。当你运行ALL_BUILD工程时,CMake将会构建整个项目。
2. INSTALL:INSTALL工程用于安装项目文件到指定的目录。在构建完成后,你可以运行INSTALL工程,将项目安装到指定的目录。
3. ZERO_CHECK:ZERO_CHECK工程用于检查项目文件是否需要重新生成。如果项目文件有任何变化,那么CMake会重新生成相应的构建工具项目文件。因此,当你修改了项目文件后,你可以运行ZERO_CHECK工程,CMake将检查文件是否需要重新生成,如果需要,就会重新生成构建工具项目文件。
需要注意的是,这三个工程是由CMake自动生成的,并不是你手动创建的。它们的作用是方便你构建、安装和检查项目文件的状态。

Q:在Linux上也会生成这3个工程吗?

from AI
是的,在Linux上也会生成这三个工程。CMake是一个跨平台的构建系统,可以在多种操作系统上运行,包括Linux。因此,无论你在哪个平台上使用CMake生成项目,它都会自动生成这三个工程。
在Linux上,CMake通常会生成Makefile文件来构建项目,而ALL_BUILD、INSTALL和ZERO_CHECK都是Makefile的构建目标。因此,当你使用CMake在Linux上生成项目时,你可以使用Make命令来构建、安装和检查项目,例如:
goCopy codemake all // 构建整个项目
make install // 安装项目文件
make clean // 清除构建文件
make zero_check // 检查项目文件状态
需要注意的是,在Linux上,CMake还可以生成其他类型的构建工具,例如Ninja和Unix Makefiles等。不过,无论使用哪种构建工具,CMake都会自动生成这三个工程。

说明

语法

#单行注释
#[[多行注释]]
${var_name}:读取变量值
set(<var_name> <var_value>):设置变量的值
cmake_minimum_required:CMake的最低版本要求
project:指定项目的名称
file:使用正则表达式匹配文件
list:用于列表的操作
message:输出消息
aux_source_directory:在目录中查找所有源文件,不递归
add_executable:列出使用的源文件,构建可执行文件
add_library:使用指定的源文件,生成静态或动态库
include_directories:添加头文件搜索路径
link_directories:指定静态库或动态库的搜索路径
target_link_libraries:将指定的静态库连接到可执行文件上

例子

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
 
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
 
set(CMAKE_BUILD_TYPE Release)
 
project(reEngine)
 
set(sourDir ${PROJECT_SOURCE_DIR}/Source)
set(inclDir ${PROJECT_SOURCE_DIR}/Include)
set(suppDir ${PROJECT_SOURCE_DIR}/Support)
 
set(sourceFiles )
set(sourceFiles ${sourceFiles};${sourDir}/FFT/FFT.cpp)
 
add_library(FFT STATIC ${sourceFiles})
 
target_include_directories(FFT PRIVATE ${suppDir}/Include;${inclDir}/FFT)
 
target_compile_definitions(FFT PRIVATE NO_MIN_MAX;_CRT_SECURE_NO_WARNINGS)
 
set_target_properties(FFT PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Lib)
 
set(sourceFiles )
set(sourceFiles ${sourceFiles};${sourDir}/reEngine/Main.cpp)
set(sourceFiles ${sourceFiles};${sourDir}/reEngine/Support.cpp)
 
add_executable(reEngine ${sourceFiles})
 
target_link_directories(reEngine PRIVATE ${suppDir}/Lib;${CMAKE_BINARY_DIR}/Lib)
 
target_link_libraries(reEngine PRIVATE FFT)
target_link_libraries(reEngine PRIVATE glfw3)
target_link_libraries(reEngine PRIVATE assimp)
 
target_include_directories(reEngine PRIVATE ${suppDir}/Include;${inclDir})
 
target_compile_definitions(reEngine PRIVATE NO_MIN_MAX;_CRT_SECURE_NO_WARNINGS)
 
set_target_properties(reEngine PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Bin)

CPack

CPack是CMake带的一个工具,用于打包

Odt笔记(20221007)