手把手教你学Makefile--五、集成与扩展篇:Makefile与其他工具配合5.1 与CMake集成:用CMake生成Makefile

五、集成与扩展篇:Makefile与其他工具配合

5.1 与CMake集成:用CMake生成Makefile

本节目标

理解​​CMake的核心价值​​(跨平台、语法简洁),学会用CMake生成Makefile,将之前的项目从“原生Makefile”迁移到“CMake管理”,提升开发效率。

一、为什么选择CMake?

原生Makefile的痛点:

  • ​跨平台困难​​:不同操作系统(Linux/macOS/Windows)的编译命令、路径分隔符不同,需维护多套Makefile;

  • ​语法繁琐​​:手动处理依赖、变量、规则,项目扩大后易混乱;

  • ​缺乏抽象​​:无法轻松支持“静态库/动态库”“单元测试”“安装部署”等复杂需求。

CMake的优势:

  • ​跨平台​​:通过CMakeLists.txt生成对应平台的构建文件(Makefile、Visual Studio工程等);

  • ​语法简洁​​:用高层命令(add_librarytarget_link_libraries)替代手动规则;

  • ​功能强大​​:支持依赖管理、编译选项、安装部署、测试等全流程。

二、CMake核心概念与命令

CMake的核心是​CMakeLists.txt​配置文件,通过“命令→变量→目标”的逻辑管理构建。常用命令:

1. project():定义项目
project(ProjectName VERSION 1.0 LANGUAGES CXX)
  • 指定项目名称、版本、支持的语言(CXX=C++)。

2. set():设置变量
set(CMAKE_CXX_STANDARD 11)  # 设置C++标准为C++11
set(CMAKE_BUILD_TYPE Debug) # 设置构建类型(Debug/Release)
3. add_library():生成库
add_library(LibName STATIC/SHARED SourceFiles.cpp)
  • STATIC:生成静态库(.a/.lib);

  • SHARED:生成动态库(.so/.dll)。

4. add_executable():生成可执行文件
add_executable(ExecutableName SourceFiles.cpp)
5. target_link_libraries():链接库
target_link_libraries(ExecutableName LibraryName)
6. include_directories():添加头文件路径
include_directories(DirectoryPath)

三、实战:用CMake重构之前的计算器项目

我们以​​计算器项目​​为例,将原生Makefile迁移到CMake。项目结构不变:

Calculator/  
├── include/            # 公共头文件  
│   ├── Calculator.h    # 计算器类声明  
│   └── MathUtils.h     # MathUtils库声明  
├── lib/                # 第三方库  
│   ├── src/            # 库实现  
│   │   └── MathUtils.cpp  
│   └── include/        # 库头文件(同公共头文件)  
├── src/                # 主程序源文件  
│   └── main.cpp        # 主程序(调用库函数)  
└── CMakeLists.txt      # CMake配置文件(新增)
1. 编写CMakeLists.txt

在根目录创建CMakeLists.txt,内容如下:

# ------------------------------
# 1. 定义项目
# ------------------------------
project(Calculator VERSION 1.0 LANGUAGES CXX)

# ------------------------------
# 2. 设置编译选项
# ------------------------------
set(CMAKE_CXX_STANDARD 11)               # C++11标准
set(CMAKE_CXX_FLAGS "-Wall -Wextra")     # 基础编译选项
set(BUILD_TYPE Debug CACHE STRING "Build type (Debug/Release)") # 构建类型(默认Debug)

# ------------------------------
# 3. 添加库(MathUtils)
# ------------------------------
# 库源文件:lib/src/MathUtils.cpp
# 库头文件:include/ 和 lib/include/
add_library(mathutils STATIC lib/src/MathUtils.cpp)
include_directories(include)             # 公共头文件路径
include_directories(lib/include)         # 库头文件路径

# ------------------------------
# 4. 添加可执行文件(calculator)
# ------------------------------
# 主程序源文件:src/main.cpp
add_executable(calculator src/main.cpp)

# ------------------------------
# 5. 链接库(calculator依赖mathutils)
# ------------------------------
target_link_libraries(calculator mathutils)
2. 生成Makefile:运行cmake

打开终端,进入项目根目录,运行以下命令生成​​Unix Makefile​​:

cmake -G "Unix Makefiles" .
  • -G "Unix Makefiles":指定生成Makefile(适用于Linux/macOS);

  • .:表示CMakeLists.txt在当前目录。

3. 编译项目:运行make

生成Makefile后,直接运行make编译:

make

CMake会自动解析依赖,编译lib/mathutils.a静态库和bin/calculator可执行文件(默认输出到CMakeBuild或当前目录的build文件夹,取决于CMake版本)。

4. 验证结果

运行可执行文件:

./calculator

输出与之前一致(比如1+2=3),说明构建成功!

四、CMake的跨平台验证(可选)

CMake的优势在于跨平台,我们可以验证在Windows上的构建:

  1. 在Windows上安装CMake和Visual Studio;

  2. 创建项目目录,复制CMakeLists.txt和源文件;

  3. 运行:

    cmake -G "Visual Studio 17 2022" .  # 生成VS工程
  4. 打开生成的.sln文件,编译项目——无需修改任何代码!

五、练习:用CMake重构你的项目

  1. ​创建CMakeLists.txt​:参考上面的例子,为你的项目编写配置文件;

  2. ​生成Makefile​​:运行cmake -G "Unix Makefiles" .

  3. ​编译项目​​:运行make,验证是否生成可执行文件;

  4. ​跨平台测试​​(可选):在Windows上用Visual Studio编译,看是否成功。

本节总结

通过CMake,你学会了:

  1. CMakeLists.txt替代原生Makefile;

  2. 生成跨平台的构建文件(Makefile/VS工程);

  3. 简化库和可执行文件的管理。

下一节预告:持续集成(CI)与Makefile

下一节我们将学习​​CI/CD​​(持续集成/持续部署),用GitHub Actions/GitLab CI自动运行make编译,确保代码提交后自动构建!

​动手小挑战​​:

给项目加一个TEST目标,用CMake生成测试可执行文件——验证CMake的多目标管理能力!

是不是发现CMake让项目构建更“现代化”?😎

(注:本节例子适用于Linux/macOS/Windows,Windows用户需调整-G参数为Visual Studio生成器,规则逻辑一致~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值