新闻中心

C++ CMakeLists.txt编写教程_C++项目构建工具CMake入门

2025-11-27
浏览次数:
返回列表
CMake通过CMakeLists.txt生成构建配置,基本语法包括指定版本、项目名、源文件编译为可执行文件。支持多源文件、目录结构、头文件路径设置(include_directories)、静态/动态库创建(add_library)与链接(target_link_libraries),并可设C++标准(如C++17)和编译选项(如-Wall)。核心是“目标”概念,对目标设置属性实现灵活构建管理。

c++ cmakelists.txt编写教程_c++项目构建工具cmake入门

CMake 是一个跨平台的构建系统生成工具,广泛用于 C++ 项目中。它不直接编译代码,而是根据 CMakeLists.txt 文件生成适用于不同构建系统的配置文件(如 Makefile、Ninja、Visual Studio 工程等)。掌握如何编写 CMakeLists.txt 是管理 C++ 项目的必备技能。

创建最简单的 CMakeLists.txt

一个最基本的 C++ 项目只需要一个源文件和对应的 CMake 配置文件。

假设你的项目结构如下:

main.cpp
CMakeLists.txt

main.cpp 中写入简单程序:

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

然后创建 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(HelloCMake)
add_executable(hello main.cpp)

说明:

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多
  • cmake_minimum_required:指定所需最低 CMake 版本,避免使用过新特性导致兼容问题。
  • project:定义项目名称,可选地设置语言(默认自动检测为 C 和 C++)。
  • add_executable:将源文件编译成可执行文件,格式为 add_executable(目标名 源文件列表)

添加多个源文件和目录结构

实际项目通常包含多个源文件。例如:

src/
  main.cpp
  utils.cpp
include/
  utils.h
CMakeLists.txt

修改 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.10)
project(MyApp)

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

# 将多个源文件构建成一个可执行文件
add_executable(myapp src/main.cpp src/utils.cpp)

说明:

  • include_directories:让编译器能找到 #include "utils.h" 这类引用。
  • 你可以把所有源文件列在 add_executable 后面,也可以用变量简化:
set(SOURCES
  src/main.cpp
  src/utils.cpp
)
add_executable(myapp ${SOURCES})

链接库文件(静态库或动态库)

如果你有独立的工具库,可以将其构建成静态库再链接到主程序。

目录结构示例:

src/main.cpp
lib/utils.cpp
include/utils.h
CMakeLists.txt

更新后的 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyApp)

include_directories(include)

# 构建静态库
add_library(myutils STATIC lib/utils.cpp)

# 生成可执行文件
add_executable(myapp src/main.cpp)

# 链接库
target_link_libraries(myapp myutils)

说明:

  • add_library:创建名为 myutils 的静态库(使用 STATIC),也可用 SHARED 创建动态库。
  • target_link_libraries:指定哪个目标需要链接哪些库。

设置编译选项和标准版本

现代 C++ 项目常使用 C++17 或更高标准。可以在 CMake 中明确指定:

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 或者针对特定目标设置
target_compile_features(myapp PRIVATE cxx_std_17)

你还可以添加警告选项提升代码质量:

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
   CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  target_compile_options(myapp PRIVATE -Wall -Wextra -pedantic)
endif()

基本上就这些。从简单项目开始,逐步加入子目录、外部依赖、条件编译等功能,CMake 能很好地支持大型 C++ 工程的组织与构建。关键是理解“目标”(target)的概念——每个可执行文件或库都是一个目标,对其设置属性(如包含路径、编译选项、链接库)才是推荐做法。

以上就是C++ CMakeLists.txt编写教程_C++项目构建工具CMake入门的详细内容,更多请关注其它相关文章!


# 怎么做  # 抖音seo相关文案  # 鹤壁知名网站建设推荐  # 南开区电商营销推广招聘  # 高职网站建设与管理  # 元旦微信营销号推广文  # 淮安公司视频号营销推广  # seo如何霸屏  # 义乌门户网站建设  # 郑州网站推广工作怎么样  # 长春seo技巧推荐公司  # 是一个  # 都是  # 解决方法  # c++  # 重写  # 链接库  # 有什么  # 多个  # 可执行文件  # red  # 配置文件  # stream  # ios  # ai  # 工具  # app  # cmake 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 学习通网页版官方登录 超星学习通电脑端入口指南  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  css链接悬停下划线样式如何自定义_使用::after结合content和transition  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区  利用Bokeh CustomJS动态控制DataTable列可见性  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  Steam官网入口直达 Steam注册及登录步骤  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  抓大鹅解压小游戏 抓大鹅摸鱼解压入口  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  微信网页版官方快速登录入口 微信网页版网页版账号直达  必由学官网快捷入口 必由学网页版在线学习平台  深入理解Promise链:如何在catch后中断then的执行  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  必由学官网首页入口 必由学教师网页版登录指南  抓大鹅无需下载版 抓大鹅秒玩版入口  J*a应用集成GitHub CLI与API认证指南  J*aScript中安全有效地处理localStorage字符串数据  yandex入口引擎手机版 yandex安卓版下载入口  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  天眼查企业查询官网入口 天眼查官方网页版查询  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  邮政快递单号查询入口 邮政快递物流信息在线查询入口  iCloud登录入口网页版 苹果iCloud官网登录  新三国志曹操传110级星符试炼夏侯渊极难攻略  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  聚水潭ERP登录页面入口 聚水潭ERP官网登录界面  MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具  谷歌google账号注册详细步骤 谷歌账号注册官方教程  解决Python logging 中 datefmt 导致时间戳固定不变的问题  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  2026春节假期票务安排_2026春节放假购票指南  poki网页游戏推荐_poki免费游戏平台入口  动漫岛观看全网网 动漫岛在线正版动漫入口  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  J*aScript实现动态背景色下的文本与按钮颜色自适应调整 

搜索