1、CMake指定Generator(生成器)
cmake --help
“ * ” 标的位置表示默认使用的generator是 Visual Studio 17 2022,直接使用命令 cmake 则会生成vs工程。如果想使用其他的generator,比如 MinGW, 使用下面的方式可以生成Makefile文件
cmake -G "MinGW Makefiles" ..\source\
2、CMake 统一构建的方式
#构建当前目录下的文件
cmake --build .
#清理生成的文件
cmake --build . --target clean
cmake --build . --target clean 是一个命令,用于清除由 CMake 生成的构建系统产生的文件和目录。这个命令的含义是:
- cmake --build . 表示使用 CMake 来构建当前目录下的项目。CMake 会根据选择的生成器(generator)来调用相应的构建工具,比如 make 或者 Visual Studio。
- –target clean 表示指定要构建的目标(target)为 clean。这个目标是由 CMake 3.X 版本提供的,用于删除所有的构建输出,比如对象文件(object files),库文件(library files),可执行文件(executables),以及生成的文件(generated files)
这个命令可以在任何支持 CMake 的平台上运行,无需知道具体的构建工具或者命令。它可以帮助你保持一个干净的构建目录,避免一些潜在的构建问题。
可以使用 help 获取可选的目标项
3、CMake多文件C++项目
- CMakeLists.txt
#最小版本要求
cmake_minimum_required(VERSION 3.5)
#项目
project(HelloApp
VERSION 0.0.1
DESCRIPTION "The leading Hello world App"
LANGUAGES CXX)
#不推荐使用这种方式 CMake的官方文档也不推荐使用这种方式
#file(GLOB_RECURSE SRC_FILES src/*.cpp)
#add_executable(HelloBinary main.cpp ${SRC_FILES})
#Target
add_executable(HelloAppBinary main.cpp
src/dog.cpp
src/operations.cpp
)
#目标编译器的特性设置
target_compile_features(HelloAppBinary PRIVATE cxx_std_20)
target_include_directories(HelloAppBinary PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
CMake提供了几种方式来指定源文件,一种是使用全局的方式,一种是将源文件一一列出的方式。使用globbing的方式比较简单,但是也有缺点,关于使用globbing的优缺点可以参考Stack OVerflow中的回答:
Is it better to specify source files with GLOB or each file individually in CMake? - Stack Overflow
其中有一条回答大致意思是:
CMake的创建者建议不要使用globbing,因为当创建/删除文件时,globbing不会自动更新构建系统。这可能会导致其他人在构建你的代码时遇到问题,他们从版本控制中更新项目,运行构建,然后联系你,抱怨“构建出错了”。而且,失败通常会给出一些链接错误,这些错误并没有给出问题的任何提示,因此会浪费时间进行故障排除。
作者曾在一个项目中使用globbing,但是当添加新文件时收到了很多投诉,这足以成为明确列出文件而不是使用globbing的理由。这也破坏了常见的Git工作流(如git bisect和在功能分支之间切换)。
因此,作者不建议使用globbing。它带来的问题远远超过了它的便利性。当有人因为这个问题无法构建你的软件时,他们可能会花费大量的时间来追踪问题,或者直接放弃。
然而,也有一些例外情况,globbing可能更可取:
- 为现有的不使用CMake的项目设置CMakeLists.txt文件。这是一种快速引用所有源的方法(一旦构建系统运行起来,就用明确的文件列表替换globbing)。
- 当CMake不是主要的构建系统时,例如,你正在使用一个项目,他们不使用CMake,你希望为它维护自己的构建系统。
- 对于文件列表经常变化,以至于不实际维护的任何情况。在这种情况下,globbing可能会有所帮助,但是你必须接受每次运行cmake生成构建文件以获得可靠/正确的构建(这违反了CMake的意图 - 分离配置和构建的能力)。