c++如何使用CMake构建项目_c++现代化构建系统入门

发布时间 - 2026-01-05 00:00:00    点击率:
CMake是现代C++主流构建系统,通过CMakeLists.txt跨平台生成构建脚本。1. 安装需编译器与CMake 3.10+;2. 编写CMakeLists.txt定义项目;3. 外部构建避免污染源码;4. 支持多文件与子目录;5. 可链接静态/动态库;6. 用find_package或FetchContent管理依赖;7. 设置C++标准与编译选项。掌握这些即可高效构建项目。

在现代 C++ 开发中,CMake 已成为主流的构建系统。它跨平台、灵活,并能与编译器、编辑器和测试框架良好集成。相比传统的 Makefile 手动编写,CMake 通过简洁的 CMakeLists.txt 文件描述项目结构,自动生成适用于不同平台的构建脚本(如 Makefile、Ninja、Visual Studio 项目等),极大提升了开发效率。

1. 安装 CMake 与基本环境准备

使用 CMake 前需确保已安装:

  • 一个 C++ 编译器(如 GCC、Clang 或 MSVC)
  • CMake 工具本身(建议版本 3.10 以上)

在 Linux/macOS 上可通过包管理器安装:

sudo apt install cmake # Ubuntu/Debian
brew install cmake # macOS

Windows 用户可从 cmake.org 下载安装程序。安装后验证:

立即学习“C++免费学习笔记(深入)”;

cmake --version

2. 编写最简单的 CMakeLists.txt

创建项目目录并添加源文件 main.cpp

#include iostream>
int main() {
  std::cout   return 0;
}

在同一目录下创建 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyApp)
add_executable(myapp main.cpp)

说明:

  • cmake_minimum_required 指定最低 CMake 版本
  • project 定义项目名称
  • add_executable 将源码构建成可执行文件

3. 构建项目:分离构建目录

推荐使用“外部构建”方式,避免污染源码目录:

mkdir build
cd build
cmake ..
cmake --build .

这会在 build/ 目录生成中间文件和最终可执行文件 myapp。调用 cmake .. 读取上级目录的 CMakeLists.txt 并生成构建系统;cmake --build . 执行实际编译。

4. 添加多个源文件与子目录支持

若项目包含多个文件,例如:

src/main.cpp
src/hello.cpp
include/hello.h

修改 CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(MyApp)

# 添加头文件搜索路径
include_directories(include)

# 指定所有源文件构建为可执行文件
add_executable(myapp
  src/main.cpp
  src/hello.cpp
)

对于更复杂的结构,可用 add_subdirectory(src) 将子模块独立管理。

5. 链接库:静态库与动态库

假设你想将 hello.cpp 编译成静态库供主程序使用:

# 在 src/CMakeLists.txt 中
add_library(hello STATIC hello.cpp)

然后在根 CMakeLists.txt 中引入:

cmake_minimum_required(VERSION 3.10)
project(MyApp)

include_directories(include)
add_subdirectory(src)

add_executable(myapp src/main.cpp)
target_link_libraries(myapp hello)

target_link_libraries 明确指定依赖关系,是现代 CMake 推荐做法。

6. 使用外部依赖:find_package 与 FetchContent

常见第三方库如 Boost、OpenCV 可通过 find_package 查找:

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(myapp ${OpenCV_LIBS})

对于没有系统安装的库,可用 FetchContent 直接从 Git 获取:

include(FetchContent)
FetchContent_Declare(
  fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG v9.1.0
)
FetchContent_MakeAvailable(fmt)

target_link_libraries(myapp fmt::fmt)

这种方式实现“开箱即用”,适合 CI 或团队协作。

7. 设置 C++ 标准与编译选项

启用现代 C++ 特性(如 C++17):

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

或针对特定目标设置:

target_compile_features(myapp PRIVATE cxx_std_17)

也可添加警告选项提升代码质量:

target_compile_options(myapp PRIVATE -Wall -Wextra)

基本上就这些。掌握以上内容,你已经可以使用 CMake 构建现代化 C++ 项目。随着项目变大,可进一步学习 installCPack、测试集成(enable_testing + add_test)等高级功能。CMake 的核心理念是“描述目标而非过程”,写出清晰、可维护的构建脚本,是专业 C++ 开发的重要一环。


# linux  # git  # windows  # github  # app  # ubuntu  # 工具  # mac  # ai  # c++  # ios  # macos  # Static  # include  # int  # private  # visual studio  # opencv  # https  # debian  # 多个  # 可执行文件  # 可通过  # 与子  # 主程序  # 推荐使用  # 适用于  # 也可  # 可以使用  # 你已经 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么在Controller之外的地方验证数据  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何自定义分页视图?(Pagination示例)  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  高端企业智能建站程序:SEO优化与响应式模板定制开发  php 三元运算符实例详细介绍  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  在线制作视频网站免费,都有哪些好的动漫网站?  如何确保FTP站点访问权限与数据传输安全?  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  实现点击下箭头变上箭头来回切换的两种方法【推荐】  三星网站视频制作教程下载,三星w23网页如何全屏?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  linux写shell需要注意的问题(必看)  百度浏览器如何管理插件 百度浏览器插件管理方法  如何实现建站之星域名转发设置?  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  中山网站推广排名,中山信息港登录入口?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何使用Livewire构建动态组件?(入门代码)  如何在阿里云高效完成企业建站全流程?  如何快速搭建安全的FTP站点?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  零服务器AI建站解决方案:快速部署与云端平台低成本实践  javascript中对象的定义、使用以及对象和原型链操作小结  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何在万网开始建站?分步指南解析  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在万网利用已有域名快速建站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何快速搭建高效香港服务器网站?  北京网站制作的公司有哪些,北京白云观官方网站?