CMakeLists.txt实战指南:从入门到被CMake折磨的那些年(超详细)

CMakeLists.txt 从看懂到会写:安装、构建与跨平台实战指南 C++ 跨平台开发常受制于不同平台的构建规则差异。CMake 作为构建系统生成器,通过读取 CMakeLists.txt 描述文件,生成 Makefile、Ninja 或 Visual Studio 工程,实现一次编写、多平台构建。其价值在于解耦构建逻辑与平台细节,提升工程可移植性与模块复用。从安装配置、版本确认到 out-of-source 构建,再到 add_executable、target_link_libraries 与 find_package 等命令,掌握 CMake 能降低多模块与第三方库依 阅读详情

刚接触CMake那会儿,我对着满屏幕的红色报错怀疑人生——这玩意儿怎么比C++模板还难搞?!(别笑!)后来才明白,CMakeLists.txt就是个傲娇的甲方爸爸,你写的每个字母它都要检查八百遍!今天咱们就手把手把这个"项目说明书"的写法掰开揉碎讲清楚!

一、你的第一个CMakeLists.txt(真·5分钟速成版)

先来个最简单的版本镇场子:

cmake_minimum_required(VERSION 3.10)  # 重要程度五颗星!!!
project(MyAwesomeProject)            # 项目名要够骚气

add_executable(main main.cpp)        # 核心中的核心(敲黑板)

运行命令:

mkdir build && cd build
cmake ..
make -j4

(看到那个绿色进度条了吗?恭喜你成功召唤了CMake之魂!)

二、CMakeLists.txt的七种武器(必杀技合集)

1. 头文件大作战

target_include_directories(main 
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include  # 公共头文件
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src      # 私有头文件
)

(划重点)用target_开头的命令才是现代CMake的正确姿势!那些老教程教的include_directories()早该进博物馆了!

2. 库文件三连击

find_package(OpenCV REQUIRED)          # 找系统库
add_library(mylib STATIC src/mylib.cpp) # 自己造轮子
target_link_libraries(main 
    PRIVATE 
        OpenCV::OpenCV 
        mylib
) 

遇到Could NOT find OpenCV?试试设置-D OpenCV_DIR=/your/opencv/path(血的教训)

3. 编译选项黑科技

target_compile_options(main 
    PRIVATE
        -Wall           # 开启所有警告
        -O3             # 优化到飞起
        $<$<CXX_COMPILER_ID:MSVC>:/W4>  # VS专属福利
)

(高级技巧)这个$<...>叫做生成器表达式,CMake界的瑞士军刀!

三、大型项目生存指南(保命技巧)

1. 模块化开发(拒绝屎山代码!)

project_root/
├── CMakeLists.txt
├── app/
│   └── CMakeLists.txt
└── lib/
    └── CMakeLists.txt

主CMakeLists.txt:

add_subdirectory(lib)
add_subdirectory(app)

子目录CMakeLists.txt:

target_link_libraries(app_main PRIVATE lib_core)

(千万注意)变量作用域!子目录的变量父目录看不见!

2. 安装配置(打包带走)

install(TARGETS main 
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

install(DIRECTORY include/ 
    DESTINATION include
    FILES_MATCHING PATTERN "*.h"
)

生成安装包:

cmake --build . --target install

四、报错急救包(亲测有效)

1. “No CMAKE_CXX_COMPILER could be found”

(灵魂三问):

  1. 装了编译器吗?
  2. 环境变量设置了吗?
  3. 选对生成器了吗?(-G "MinGW Makefiles")

2. “target […] includes non-existent path”

(常见踩坑):

  • 路径写成了/include/(多写个斜杠)
  • 用了绝对路径但换电脑了
  • 变量名拼写错误(cmake区分大小写!)

3. “undefined reference to…”

(死亡三件套检查):

  1. 源文件加到add_executable了吗?
  2. 链接库顺序对吗?(被依赖的库放后面)
  3. 用了C++17特性但没设置标准?

五、高手进阶路线(秃头警告)

1. 玩转生成器表达式

target_compile_definitions(main
    PRIVATE
        $<$<CONFIG:Debug>:DEBUG_MODE=1>
)

2. 自定义Find模块

创建FindMyLib.cmake:

find_path(MYLIB_INCLUDE_DIR mylib.h)
find_library(MYLIB_LIBRARY NAMES mylib)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MyLib DEFAULT_MSG
    MYLIB_INCLUDE_DIR
    MYLIB_LIBRARY
)

3. 单元测试集成

enable_testing()
add_test(NAME my_test COMMAND test_executable)

六、CMakeLists.txt的十大禁忌(必看!)

  1. 在非build目录运行cmake(文件污染警告!)
  2. 用全局命令污染变量(include_directories害死人)
  3. 忘记设置C++标准(C++20不是默认的!)
  4. 硬编码路径(/home/xxx这种写法会遭报应)
  5. 混合使用新旧语法(要么复古要么现代)
  6. 忽略缓存变量(clean build治百病)
  7. 过度使用宏(CMake不是C预处理器!)
  8. 不写版本限制(兼容性炸弹)
  9. 滥用GLOB收集源文件(新增文件不自动检测)
  10. 不看官方文档(https://cmake.org/cmake/help/latest/)

(看到这里还没关页面?看来是真爱了!)

最后说句掏心窝子的:CMake就是个越用越香的傲娇工具。刚开始被虐到怀疑人生正常,坚持住!哪天突然开窍了,你会发现它简直是跨平台开发的瑞士军刀。遇到报错别慌,先检查下是不是又忘了写)——别问我怎么知道的(捂脸)

VSCode+CMake:C/C++跨平台构建与调试实战指南 在C/C++工程开发中,构建系统的选择直接影响跨平台协作与调试效率。CMake作为一套跨平台的构建系统生成器,通过CMakeLists.txt统一描述项目结构,自动生成对应平台的Makefile或工程文件;而VSCode凭借轻量级编辑体验与丰富的插件生态(如CMake Tools),将配置、构建、调试流程可视化。两者结合,解决了从MinGW到GCC工具链的识别、头文件路径配置、Debug/Release切换等常见痛点,使开发者只需维护一份构建脚本,即可在Windows、Linux、macOS上无缝编译与断点 阅读详情

相关推荐

C++项目结构规划与CMakeLists.txt最佳实践:从目录骨架到构建避坑

C++工程的长期维护不仅依赖代码逻辑,更取决于清晰的项目结构与稳健的构建系统。一个合理规划的目录骨架,能将源码、头文件、测试与示例有效隔离,避免接口失控与依赖混乱;而CMakeLists.txt作为现代C++构建的核心,其target-based写法决定了编译效率与可扩展性。本文从工程实践视角,介绍include/src/tests分层思想与不同规模项目的组织策略,解析CMake中PUBLIC/PRIVATE可见性、多模块构建、链接依赖传递等关键原理,并针对源码树外构建、GLOB扫描、MSVC运行时库等高频

weixin_30402231的博客 226

如何编写一个CMakeLists.txt文件(由简到难,较详细)

在Linux系统下,经常使用CMakeLists.txt文件来链接、编译C++工程,大部分人clone的代码里都是有CMakeLists.txt文件的,只需要cmake ..和make就完事了,但在工作中,你必须要有从无到有编写CMakeLists.txt文件的能力。

weixin_43662044的博客 3257

OpenCV + CMake 报错排查实战:从环境配置到编译避坑指南

在C++项目开发中,构建系统与依赖管理是绕不开的基础环节。CMake作为跨平台构建工具,负责组织编译流程与依赖查找,而OpenCV作为主流计算机视觉库,其安装与集成方式直接影响项目稳定性。当两者结合时,常因版本不匹配、路径配置错误或依赖缺失导致编译失败,例如find_package无法定位OpenCVConfig.cmake、源码编译时缺少libjpeg等开发包、CUDA架构设置不当等。理解CMake的配置原理与OpenCV的构建结构,有助于快速定位问题根因。通过合理的环境准备、规范的外部构建目录及清晰的排

weixin_28826521的博客 234

cmake1:如何编写CMakeLists.txt

注:转载自:链接;该作者的cmake系列都很好,值得一看。 如何编写CMakeLists.txt文件 CMakeLists.txt 文件大小写不敏感 大型项目的根目录和子目录都会有这个文件 cmake_minimum_required( VERSION 2.8 ) 这是声明要求的cmake编译器的最低版本 终端输入 cmake -version 可查看cmake的版本 project(slam) 这是声明cmake工程名字 project(slam VERSION 0.0.1) 还可以增加版本号 .

wonengguwozai的博客 655

CMake从入门到实战:跨平台构建、版本管理与常见报错排查

在C++工程开发中,构建系统直接关系到代码的编译效率与可移植性。传统的手写Makefile虽然灵活,但在面对多平台、多编译器和复杂第三方依赖时,往往暴露出维护成本高、路径配置易错等问题。CMake通过生成平台对应的构建系统(如Makefile、Visual Studio工程或Ninja文件),用一份CMakeLists.txt统一描述项目结构、库依赖和编译选项,成为现代C++项目的标准构建工具。其核心的target机制与依赖传递设计,让头文件路径和链接库的管理更加清晰。无论是Linux下配置MPI并行环境,

weixin_28834765的博客 347

【Clion】无需手动修改CMakeLists.txt:C/C++单文件运行插件全攻略

本文详细介绍了Clion中C/C++单文件运行插件的安装与使用全攻略。该插件能智能解决因未配置CMakeLists.txt导致的运行报错问题,用户无需手动修改CMakeLists.txt即可右键直接编译运行单个.c/.cpp文件,极大提升了算法练习、代码测试等场景下的开发效率。

weixin_28840591的博客 267

【CMake】从入门到实战:一文吃透CMake核心命令行与工程构建全流程

做C/C++开发的同学,一定都被工程构建问题折磨过:Linux下要手写复杂的Makefile,依赖关系、增量编译、跨目录管理稍有不慎就出问题,中大型项目手写维护几乎是噩梦; Windows下要对着Visual Studio的工程属性一顿配置,换个版本、换个机器就可能编译失败;想做跨平台开发?要同时维护Linux的Makefile、Windows的vcxproj、Mac的Xcode工程,光是配置同步就能耗掉大半开发时间。而CMake的出现,彻底解决了这些痛点。作为C/C++领域事实上的工程构建标准,它只需要你

会当凌绝顶,一览众山小 2006

Windows下CMake 3.25实战:安装配置与CMakeLists避坑指南

跨平台构建系统CMake是现代C++工程管理的基础工具,其核心原理是通过声明式脚本生成Visual Studio或Ninja等原生构建文件,从而屏蔽编译器与平台差异。在Windows环境下,掌握CMake的安装选型、生成器选择及CMakeLists.txt编写技巧,能有效提升C++项目的构建效率与可维护性。本文围绕CMake 3.25版本,结合Visual Studio 2022实际工程场景,梳理从最小工程配置到预编译头、CUDA集成、MPI依赖等高频问题的排查思路,帮助开发者快速构建稳定可迁移的Windo

weixin_28839601的博客 212

别再手写 CMakeLists.txt 了!我写个开源神器让我彻底解放了

《别再手写 CMakeLists.txt 了!开源神器 EasyCMake 解放开发者》介绍了一款可视化 CMake 配置工具,旨在解决 C++ 开发者手动编写 CMake 时的常见痛点。通过表单化操作,用户可快速生成规范的 CMakeLists.txt 文件,无需记忆复杂语法。工具支持动态添加源文件、单文件编译选项(如针对特定文件优化)、第三方库依赖配置等功能,并允许保存/加载 JSON 配置以便复用。其核心亮点包括:实时预览、30秒生成完整项目配置,以及对 set_source_files_proper

orangejuer的博客 232

使用 Wireshark 分析 PPPoE 流量中的 BRAS 名称 AC-Name

客户端发出广播请求,寻找 PPPoE 服务器。: BRAS 服务器响应 PADI 请求,提供服务并包含AC-Name。: 客户端选择一个 BRAS 并发起连接请求。: BRAS 确认连接并分配会话 ID。在这些阶段中,AC-Name是 BRAS 提供的一个关键字段,用于标识服务器名称。

caca_66的博客 2066

【Codecs系列】HEVC-SCC(一):核心技术介绍

DATE: 2020.6.4【Tags: HEVC SCC】 1、参考网址 2、SCC简介 3、HEVC-SCC核心技术

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 4803

CMake学习篇[1]---CMake入门demo+从0开始+含项目文件

本文介绍了CMake的基本概念和使用方法,重点讲解了CMakeLists.txt的编写和常用命令。内容包括:1) CMake的跨平台特性,通过生成本地Makefile实现编译;2) 项目结构组织,展示了一个简单的CMake项目示例;3) 详细解析了三个核心命令:cmake_minimum_required指定最低版本要求,project定义项目名称和属性,add_executable生成可执行文件。文章还提到CMake注释的两种语法形式。该教程适合CMake初学者快速入门,为后续深入学习打下基础。

Edwinwzy的博客 809

R语言做一个 GM (1,1)灰色预测模型

累加生成是GM(1,1)模型的另一个重要步骤,它通过构造累加生成序列,把非线性非平稳时间序列转化为线性平稳时间序列。GM(1,1)是一种基于灰色系统理论的预测模型,通常用于中小样本的非线性、非平稳时间序列数据分析。灰色预测模型的核心是灰度处理,将原始时间序列转化为灰色时间序列。这里使用R语言中的diff函数对时间序列进行一次差分,然后对结果取累加和得到灰度序列。以上是GM(1,1)灰色预测模型在R语言中的实现步骤。需要注意的是,GM(1,1)模型适用于中小样本的时间序列预测,对于长期预测效果可能较差。

Mrrunsen的博客 3841

ROS2 CMakeLists.txt 从零掌握:手写编译配置与避坑指南

CMake 是跨平台构建系统的核心,而 ROS2 采用 ament_cmake 作为编译体系,CMakeLists.txt 正是连接源码与可执行文件的桥梁。理解 find_package、add_executable 和 ament_target_dependencies 的协作原理,是每个 ROS2 C++ 开发者绕不开的基础功。通过这份配置,编译器能自动定位依赖头文件、链接库并生成规范的安装规则,从而避免重复踩中头文件丢失、链接失败等高频编译错误。在实际工程中,无论是发布订阅节点还是复杂功能包,清晰的手

weixin_34198762的博客 319

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

SDMA 如何实现设备对主机内存的访问

摘要:SDMA(System Direct Memory Access)是PCIe设备直接访问主机内存的核心机制,使外设无需CPU干预即可高效读写系统RAM。其实现原理包括:设备作为主控发起DMA请求,通过PCIe Memory TLP访问主机物理地址;完整通路涉及驱动分配DMA安全内存、设备配置、地址转换(IOMMU)和中断通知等步骤;关键技术涵盖地址类型(HPA/IOVA)、TLP格式、缓存一致性和安全防护机制。SDMA广泛应用于GPU、网卡、NVMe等高性能场景,是现代异构计算的基础技术,需软硬件协同

MHD0815的博客 239

手把手教你玩转CMake构建工具(实战向教程)

还在被各种IDE的工程配置折磨?每次换开发环境都要重新配置项目?CMake就是你的救星!(认真脸)这个跨平台的构建工具,能让你用一份配置文件通吃Windows/Linux/macOS三大平台。最近帮学弟调试项目时发现,很多新手对CMake的认知还停留在"复制粘贴CMakeLists.txt"阶段,今天我们就来彻底搞懂它!每个子目录都放独立的CMakeLists.txt使用include()管理通用配置善用组织项目结构。

debugdynamo的博客 1053

Python实现FFT、小波变换和数据压缩

小波变换是一种分析信号的方法,可以分解信号成为多个尺度和频率的分量,从而更好地理解和处理信号。在Python中,我们可以使用pywt库来实现小波变换。在Python中,我们可以使用numpy库中的fft模块来实现FFT。数据压缩是一种将数据表示成更紧凑的形式的方法,可以减少存储空间和传输带宽。综上所述,Python提供了很多方便的工具来实现各种信号处理和数据压缩的方法。本文将介绍Python中如何实现傅里叶变换(FFT)、小波变换以及如何使用它们来进行数据压缩。Python实现FFT、小波变换和数据压缩。

学习使你进步。 691

CMake入门指南:跨平台构建工具的核心用法

构建系统是现代软件开发中的基础设施,用于自动化编译、链接和打包过程。CMake作为元构建系统,通过生成平台特定的构建文件(如Makefile或Visual Studio项目)实现跨平台兼容性,解决了多环境下的构建一致性问题。其核心价值在于简化复杂项目的依赖管理,支持C/C++等语言的混合编译,并能集成静态分析、单元测试等工程实践。在持续集成、跨平台开发等场景中,CMake配合FetchContent等模块能高效管理第三方依赖。本文以CMakeLists.txt配置为切入点,详解从基础命令到模块化组织的进阶技

weixin_28835551的博客 316

AgentScope 2.0 源码解析-工具系统解读:从内置工具到权限管控的完整实践

本文深入解析AgentScope 2.0工具系统的完整架构,覆盖内置工具集(文件读写、命令执行、搜索匹配)、MCP协议集成(STDIO/HTTP双传输、客户端封装、工作空间网关)、工具包管理与动态分组、权限引擎的多级决策机制(危险路径保护、只读识别、模式控制),以及自定义工具开发流程。通过分层架构图和时序图直观展示组件协作关系,结合安全最佳实践与故障排除指南,为开发者提供从工具使用到安全管控的全链路参考。

program哲学 564

机器学习的低代码与无代码平台:便捷入门之路

机器学习领域正涌现出大量低代码和无代码平台,使非技术人员也能轻松应用AI技术。低代码平台(如PyCaret、H2O AutoML)需少量编程但灵活性强,而无代码工具(如Google Cloud AutoML、Teachable Machine)则完全无需编程基础。这些平台覆盖图像识别、文本处理、业务预测等多种场景,适合快速部署简单项目。但专业人士仍需注意,这些工具无法替代复杂场景下的定制化开发。随着技术进步,低门槛AI工具正在改变各行业的创新方式。

2501_90323865的博客 154

CMake实战指南:从构建系统生成器到跨平台项目高效管理

构建系统是软件工程的基石,直接影响代码的编译、链接与交付效率。在跨平台开发场景中,如何统一管理不同操作系统下的编译流程,成为团队协作与持续集成的关键挑战。CMake作为一款强大的构建系统生成器,通过声明式CMakeLists.txt描述项目结构,自动生成Makefile、Ninja或Visual Studio工程,解决手写构建脚本维护成本高、平台行为不一致等痛点。文章从CMake核心概念入手,涵盖安装降级、Generator匹配、编码处理、VSCode集成、STM32嵌入式交叉编译及CPack打包发布等实战

weixin_34090562的博客 656

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

CMake 入门指南:从零开始构建你的第一个项目

本文是CMake入门教程,详细介绍如何从零开始构建第一个项目。通过Hello World示例和核心指令解析,帮助开发者掌握CMake的跨平台构建能力,包括项目配置、源代码管理、库文件创建与链接等实用技巧,适合初学者快速上手。

hh234的博客 509

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

别再手写 Makefile/VS 工程!CMake:1 份配置搞定多平台

本文针对跨平台编译的痛点,用 “翻译官” 类比拆解 CMake 核心功能 —— 生成适配不同系统的编译规则,而非直接编译。对比 CMake 与 make、kbuild 的差异,详解多系统安装步骤,通过 “Hello World”、多文件、链接外部库 3 个案例带新手实战,解答 “运行端是否装 CMake” 等疑问,助读者快速掌握这一 “跨平台编译利器”。

进一步有进一步的欢喜~ 849

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

告别Makefile?CMakeLists.txt核心解析与实战避坑指南

在Linux下进行C/C++项目开发时,构建工具的选择直接影响工程效率。传统Makefile通过目标、依赖和规则组织编译流程,虽在小项目中简洁,但在跨平台、依赖管理及环境探测方面日益吃力。CMake通过“配置阶段+生成阶段”将项目描述与具体构建系统解耦,同一份CMakeLists.txt可生成Makefile或Ninja文件,已成为现代C++工程的事实标准。无论你遇到“make没有指明目标并且找不到makefile”的经典报错,还是Windows下“flutter cmake error at cmakel

weixin_42522669的博客 277

NDK开发 从入门到放弃(七:Android Studio 2.2 CMAKE 高效NDK开发)

前言之前,每次需要边写C++代码的时候,我的内心都是拒绝的。 1. 它没有代码提示!!!这意味着我们必须自己手动敲出所有的代码,对于一个新手来说,要一个字母都不错且大小写也要正确,甚至要记得住所有的jni函数等,真是太折磨人了…平时写java代码的时候都是写几个字母会出来一大堆提示然后选择的,这样还有一个好处就是很多时候我们不知道有那些函数,但是我们可以通过obj.,然后就可以看到它有哪些方法函数

小雨的专栏 2万+
上一篇: 手把手教你解决CMakeLists.txt报错难题(附真实案例)
下一篇: 这行代码暗藏玄机!getchar()函数深度使用指南(手把手教学版)
普通网友
博客等级 码龄2年 89粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值