0

0

C++项目怎么编译_使用CMake管理跨平台C++工程的实战指南

冰火之心

冰火之心

发布时间:2025-12-07 21:36:41

|

254人浏览过

|

来源于php中文网

原创

答案:CMake通过“配置+生成+构建”流程实现跨平台C++项目管理,推荐项目结构包含src、include、lib和build目录,根目录CMakeLists.txt设置最低版本、项目信息、C++标准、头文件路径及源文件,使用add_executable生成可执行文件,target_link_libraries链接库,link_directories引入静态库,FetchContent自动获取依赖如Google Test,通过WIN32、UNIX、APPLE等变量处理平台差异,支持用-G生成Visual Studio或Xcode项目,构建时建议独立build目录并运行cmake ..与cmake --build .,实现一次配置多平台编译。

c++项目怎么编译_使用cmake管理跨平台c++工程的实战指南

在现代C++开发中,跨平台项目需要一套统一、清晰的构建方式。CMake 是目前最流行的构建系统生成工具,它不直接编译代码,而是根据配置文件生成适用于不同平台的构建脚本(如 Makefile、Ninja、Visual Studio 项目等)。下面是一个实用的实战指南,帮助你用 CMake 管理跨平台 C++ 工程。

1. 项目结构设计

一个清晰的项目结构是成功的第一步。推荐如下目录布局:

my_project/
├── CMakeLists.txt
├── src/
│ ├── main.cpp
│ └── utils.cpp
├── include/
│ └── utils.h
├── lib/
│ └── (第三方库或静态库)
└── build/
└── (编译产物,建议.gitignore)

根目录的 CMakeLists.txt 是入口文件,控制整个项目的构建流程。

2. 编写基础 CMakeLists.txt

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

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

cmake_minimum_required(VERSION 3.10)
project(MyApp VERSION 1.0 LANGUAGES CXX)

设置C++标准

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

包含头文件目录

include_directories(include)

添加可执行文件

add_executable(${PROJECT_NAME}
src/main.cpp
src/utils.cpp
)

可选:链接外部库(例如使用 pthread)

target_link_libraries(${PROJECT_NAME} pthread)

说明:

  • cmake_minimum_required:指定所需最低 CMake 版本。
  • project:定义项目名称、版本和语言。
  • include_directories:让编译器能找到头文件。
  • add_executable:指定生成可执行文件及其源码。

3. 配置构建流程(跨平台通用)

在项目根目录下执行以下命令进行编译:

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

解释:

LongCat AI
LongCat AI

美团推出的AI对话问答工具

下载
  • mkdir build:创建独立的构建目录,避免污染源码(推荐做法)。
  • cmake ..:运行 CMake,读取上级目录的 CMakeLists.txt,生成本地构建系统(Linux 下是 Makefile,Windows 下可能是 Visual Studio 工程)。
  • cmake --build .:调用底层构建工具(make、ninja、MSBuild 等),无需关心平台差异。

这样一套命令在 Linux、macOS 和 Windows 上都适用,真正实现“一次配置,到处编译”。

4. 引入第三方库(以静态库为例)

假设你在 lib/ 目录下有一个预编译的静态库 libjsoncpp.a(Linux/macOS)或 jsoncpp.lib(Windows),可以这样链接:

# 在 CMakeLists.txt 中添加
link_directories(lib)
target_link_libraries(${PROJECT_NAME} jsoncpp)

更推荐使用 find_packageFetchContent 自动管理依赖,比如引入 Google Test:

include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
)
FetchContent_MakeAvailable(googletest)

添加测试可执行文件

enable_testing()
add_executable(test_main test/test_main.cpp)
target_link_libraries(test_main gtest gtest_main)
add_test(NAME test_main COMMAND test_main)

5. 处理平台差异

有时需要根据不同平台启用不同代码或链接选项。CMake 提供了内置变量:

if(WIN32)
message(STATUS "Building on Windows")
target_link_libraries(${PROJECT_NAME} ws2_32) # 链接 socket 库
elseif(UNIX AND NOT APPLE)
message(STATUS "Building on Linux")
target_link_libraries(${PROJECT_NAME} pthread)
elseif(APPLE)
message(STATUS "Building on macOS")
endif()

你也可以在代码中通过宏判断:

#ifdef _WIN32
// Windows 特有逻辑
#endif

6. 生成 IDE 项目(可选)

如果你想用 Visual Studio 或 Xcode 打开项目,可以在运行 cmake 时指定生成器:

# 生成 Visual Studio 2022 项目
cmake -G "Visual Studio 17 2022" ..

生成 Xcode 项目

cmake -G "Xcode" ..

然后就可以双击打开 .sln 或 .xcodeproj 文件进行开发。

基本上就这些。掌握 CMake 的核心在于理解“配置 + 生成 + 构建”三步流程,并写出清晰、模块化的 CMakeLists.txt。随着项目变大,可以拆分多个 CMakeLists.txt,用 add_subdirectory 组织子模块。CMake 学习曲线略陡,但一旦上手,跨平台开发效率会大幅提升。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

757

2023.08.22

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

7

2026.01.21

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

621

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1124

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

794

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

452

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2349

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

801

2023.08.10

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.2万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号