02、CMake构建多文件C++项目

1、CMake指定Generator(生成器)

cmake --help

image-20231124194412554

“ * ” 标的位置表示默认使用的generator是 Visual Studio 17 2022,直接使用命令 cmake 则会生成vs工程。如果想使用其他的generator,比如 MinGW, 使用下面的方式可以生成Makefile文件

cmake -G "MinGW Makefiles" ..\source\

image-20231124194753821

image-20231124195231278

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 获取可选的目标项

image-20231124204450709

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可能更可取:

  1. 为现有的不使用CMake的项目设置CMakeLists.txt文件。这是一种快速引用所有源的方法(一旦构建系统运行起来,就用明确的文件列表替换globbing)。
  2. 当CMake不是主要的构建系统时,例如,你正在使用一个项目,他们不使用CMake,你希望为它维护自己的构建系统。
  3. 对于文件列表经常变化,以至于不实际维护的任何情况。在这种情况下,globbing可能会有所帮助,但是你必须接受每次运行cmake生成构建文件以获得可靠/正确的构建(这违反了CMake的意图 - 分离配置和构建的能力)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值