当前位置: 首页 > article >正文

C++之 CMake、CMakeLists.txt、Makefile

这两者的关系其实非常好理解我们可以用一个**“盖房子”**的例子来打比方。简单来说CMake 是“设计师”Makefile 是“施工图纸”Make 是“施工队”。 直白的大白话解释想象你要盖一栋房子编译一个 C 项目CMakeLists.txt你的需求这是你写给设计师的需求文档。你在上面写“我要一个 3 室 2 厅的房子要有落地窗风格要现代。”这对应你的项目配置我要用 C17我有 main.cpp 和 utils.cpp 这些文件我要链接 OpenGL 库。CMake设计师/翻译官CMake 读取你的需求文档CMakeLists.txt然后根据你的环境你是住在 Linux 还是 Windows画出了一套详细的施工图纸Makefile。如果你在 Linux它会画出适合 Linux 的图纸。如果你在 Windows它会画出适合 Windows 的图纸比如 Visual Studio 的项目文件。Makefile施工图纸/说明书这是一份非常详细的操作指南。上面写着“第一步先倒水泥第二步砌墙第三步刷漆。”这对应具体的编译命令先用 g 编译 main.cpp 生成 main.o再链接…。注意Makefile 自己不会干活它只是被阅读的。Make施工队/工头Make 是一个工具它拿着Makefile施工图纸指挥具体的工人编译器 g去干活。它会检查“墙是不是已经砌好了没砌好就赶紧砌砌好了就不用管了。” 它们的具体关系CMake 生成 MakefileCMake 的工作就是写Makefile。当你运行cmake .时它就在帮你生成这个文件。Make 执行 MakefileMake 的工作是读Makefile。当你运行make时它按照 Makefile 里的指令去调用编译器。 为什么要用 CMake直接写 Makefile 不行吗行但是太累了。手写 Makefile就像你自己画施工图纸。如果房子只有 10 平米几个文件你自己画很快。但如果要盖摩天大楼几千个文件复杂的依赖或者你要在不同的地方盖Linux、Windows、Mac手写图纸会累死人而且容易出错。用 CMake你只需要写一份需求文档CMakeLists.txt。不管你要盖什么房子不管在哪里盖CMake 都能自动帮你生成对应的图纸。 总结CMake是跨平台的构建生成器。它负责把“人话”配置翻译成“机器话”Makefile。Makefile是构建脚本。它记录了具体的编译步骤。Make是执行工具。它负责执行 Makefile 里的命令。你的工作流程通常是写CMakeLists.txt- 运行cmake生成Makefile- 运行make编译代码。# 指定 CMake 的最低版本要求cmake_minimum_required(VERSION3.10)# 定义项目名称和版本project(main VERSION1.0)# 设置 C 标准为 C17并要求编译器必须支持set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIRED ON)# 导出编译命令数据库方便 VSCode 的 C/C 插件进行代码分析set(CMAKE_EXPORT_COMPILE_COMMANDS ON)# 添加头文件搜索路径include_directories(${PROJECT_SOURCE_DIR}/include)# 收集 src 目录下的所有 .cpp 源文件file(GLOB SOURCES${PROJECT_SOURCE_DIR}/src/*.cpp)# 定义要生成的可执行文件及其源文件add_executable(${PROJECT_NAME}${SOURCES})# 设置输出路径set_target_properties(${PROJECT_NAME}PROPERTIES RUNTIME_OUTPUT_DIRECTORY${PROJECT_SOURCE_DIR}/bin)这份CMakeLists.txt写得非常规范且现代比上一版更健壮。特别是你使用了set_target_properties来指定输出路径这是比旧版EXECUTABLE_OUTPUT_PATH更推荐的做法。下面我为你逐行拆解每一行代码、关键字的含义并结合你E:/C11这个项目给出它们实际对应的值。核心配置部分cmake_minimum_required(VERSION 3.10)含义声明运行此 CMake 脚本所需的最低版本。如果用户的 CMake 版本低于 3.10CMake 会报错并停止运行。作用确保脚本中使用的语法特性在当前环境中受支持。当前状态你的电脑上安装的 CMake 版本必须 ≥ 3.10。project(main VERSION 1.0)含义定义项目名称和版本号。这是 CMake 脚本中最重要的指令之一它会初始化一系列变量。关键字main这是你给项目起的名字。VERSION 1.0项目的版本号。生成的变量PROJECT_NAME值为main。PROJECT_VERSION值为1.0。PROJECT_SOURCE_DIR值为E:/C11即包含此文件的根目录。set(CMAKE_CXX_STANDARD 17)含义告诉 CMake 使用 C17 标准来编译代码。作用相当于在 g 编译器后面加了-stdc17参数。这让你可以使用现代 C 的特性如auto、filesystem等。set(CMAKE_CXX_STANDARD_REQUIRED ON)含义强制要求编译器支持 C17。作用如果编译器太老不支持 C17CMake 会直接报错而不是悄悄降级使用旧标准如 C98避免莫名其妙的编译错误。set(CMAKE_EXPORT_COMPILE_COMMANDS ON)含义生成compile_commands.json文件。作用这个文件包含完整的编译命令。VSCode 的 C/C 插件读取它就能精准地知道头文件在哪里、宏定义是什么从而提供完美的代码跳转和补全功能。源文件与路径配置include_directories(${PROJECT_SOURCE_DIR}/include)含义添加头文件搜索路径。关键字include_directories指令用于指定头文件目录。${PROJECT_SOURCE_DIR}变量引用取值为E:/C11。实际路径E:/C11/include。作用当你在代码中写#include myheader.h时编译器会去这个目录下查找。file(GLOB SOURCES ${PROJECT_SOURCE_DIR}/src/*.cpp)含义使用通配符查找文件。关键字file(GLOB ...)文件操作指令用于匹配文件路径。SOURCES你自定义的一个变量名用来存放找到的文件列表。${PROJECT_SOURCE_DIR}/src/*.cpp匹配规则。实际值假设你src文件夹里有main.cpp和test.cpp那么SOURCES变量的值就是E:/C11/src/main.cpp;E:/C11/src/test.cpp。注意这种方式会自动把src下所有.cpp加入编译不用每次新增文件都改 CMake 文件很方便。add_executable(${PROJECT_NAME} ${SOURCES})含义定义一个可执行文件目标。关键字add_executable指令生成.exeWindows或无后缀可执行文件Linux。${PROJECT_NAME}值为main这是生成的程序的名字。${SOURCES}值为上面file(GLOB ...)找到的所有.cpp文件。作用告诉 CMake“请把SOURCES里的这些代码编译成一个叫main的程序”。输出路径配置关键点set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)含义设置特定目标的属性。这里专门设置“运行时输出目录”。关键字set_target_properties指令用于精细化控制目标的属性。${PROJECT_NAME}目标名即main。PROPERTIES关键字后面跟属性名和值。RUNTIME_OUTPUT_DIRECTORY属性名专门控制可执行文件.exe的输出位置。${PROJECT_SOURCE_DIR}/bin属性值即E:/C11/bin。为什么比旧版好旧版EXECUTABLE_OUTPUT_PATH是全局变量会影响项目里所有的可执行文件。新版你用的这个只针对名为main的这个程序生效。如果你的项目将来变大了包含多个程序你可以分别为它们设置不同的输出目录互不干扰。总结你的这份 CMake 脚本逻辑非常清晰定标准要求 CMake 3.10使用 C17。找文件自动扫描src下的代码指定include目录。生程序编译生成名为main的程序。定位置把生成的程序扔进E:/C11/bin文件夹里。这套配置在 Windows 和 Linux 下通用直接运行CMake: Build即可。

相关文章:

C++之 CMake、CMakeLists.txt、Makefile

这两者的关系其实非常好理解,我们可以用一个**“盖房子”**的例子来打比方。 简单来说:CMake 是“设计师”,Makefile 是“施工图纸”,Make 是“施工队”。 🏠 直白的大白话解释 想象你要盖一栋房子(编译一个…...

财务数字化——解读集团财务管理体系构建【附全文阅读】

适应人群:集团董事长、总裁、CFO / 财务总监、财务经理、子公司经营负责人、战略与人力资源管理者。 重要性总结:本方案是一套国际水准、本土落地的集团化财务管理全案,以价值创造为核心,搭建 “战略 — 组织 — 流程 — 内控 — 资金 — 考核” 一体化闭环体系,直击传统财…...

Python正态性检验全解析:方法对比与实战应用

## 1. 正态性检验的核心价值与应用场景正态分布是统计学中的基石假设,90%的经典统计方法(如t检验、ANOVA、线性回归)都建立在数据服从正态分布的前提上。但在真实数据分析中,我们常遇到这样的困境:一组数据的直方图看起…...

wanwu框架:中文AI应用开发全栈解决方案,从RAG到智能体工作流

1. 项目概述:一个面向中文场景的AI应用开发框架最近在AI应用开发领域,一个名为“wanwu”的项目在开发者社区里引起了不小的讨论。这个由UnicomAI团队开源的项目,定位非常清晰:它旨在为中文场景下的AI应用开发,提供一个…...

LLM应用开发工具全景指南:从RAG到智能体的高效选型与实践

1. 项目概述与核心价值最近在折腾大语言模型(LLM)应用开发时,我遇到了一个非常典型的问题:想法很多,工具很杂。想给模型加个联网搜索功能,发现 LangChain 和 LlamaIndex 都能做,但哪个更适合我的…...

IoC DI 使⽤

既然 Spring 是⼀个IoC(控制反转)容器,作为容器,那么它就具备两个最基础的功能:• 存• 取Spring容器管理的主要是对象,这些对象,我们称之为"Bean".我们把这些对象交由Spring管理,由 Spring来负责对象的创建和销毁.我们…...

AI Agent 面试题 006:Agent的自主性(Autonomy)具体体现在哪些方面?

🔥 AI Agent 面试题 006:Agent的自主性(Autonomy)具体体现在哪些方面?摘要:本文深入解析了「Agent的自主性(Autonomy)具体体现在哪些方面?」这一 AI Agent 领域的核心面试…...

向量检索核心知识整理

一、向量基础:Embedding 与维度选择 1. 向量化核心流程:非结构化数据 → 向量 向量化是将文本、图像、音频等非结构化数据,通过 Embedding 模型 转化为高维稠密向量的过程,是向量检索的基础:数据类型常用模型文本BGE、…...

哈希密钥:解锁unordered容器的极速潜能

目录 一.unordered系列关联式容器 二:unordered_set 1:unordered_set用法详解 1.1:模板参数介绍 1.2:unordered_set的构造函数 1.3:常用接口使用 1.3.1:insert与erase 1.3.2:find与size与empty 1.3.3:clear与swap与count 1.3.4:迭代器 1.3.5:桶操作 三:unordered_ma…...

31.在函数组件里如何使用多个 state 变量?

在 React 中,你可以通过多次调用 useState 来管理多个彼此独立的状态。每一次 useState(...) 都会创建一块独立的 state,以及对应的更新函数,这样更清晰、也更便于维护。示例:在一个表单里管理多个 stateimport React, { useState…...

OPA策略引擎:从原理到Kubernetes集成的云原生策略管理实践

1. 项目概述:什么是 OPA,以及它为何如此重要如果你在云原生、微服务或者 DevOps 领域工作,那么“策略即代码”这个概念你一定不陌生。而提到策略即代码,就绕不开Open Policy Agent,也就是我们常说的 OPA。简单来说&…...

13.有没有PCB焊接过程的图片,没有自己怎么弄

1.有没要PCB焊接过程的图片,没有自己怎么弄解释:我们并不提供PCB焊接过程的图片,如果有需要的同学可以自己用我们提供的PCB文件打印PCB板子(打印下单不会的看本站下单教程),然后自己使用电烙铁焊接一片&…...

1. 开发工具软件介绍

1.开发工具软件怎么安装 我们提供的开发工具就是这个项目需要用到的软件,包括keil5安装包、STLINK驱动、AD软件等等 软件介绍 Keil5 是一款针对ARM架构单片机(尤其是STM32系列)的集成开发环境(IDE),集成了…...

Transformer线性层与激活函数:原理与优化实践

1. Transformer模型中的线性层与激活函数解析在Transformer架构中,线性层(Linear Layers)和激活函数(Activation Functions)构成了模型处理信息的基础单元。不同于传统神经网络,Transformer通过自注意力机制…...

Changelogger:实时更新日志聚合器的架构设计与工程实践

1. 项目概述与核心价值在技术迭代日新月异的今天,尤其是AI工具和开发者软件领域,几乎每天都有新的功能发布、API更新或产品迭代。作为一名长期泡在代码和产品里的从业者,我深有体会:错过一个关键更新,可能意味着浪费数…...

新能源上市公司361个指标数据2000-2021年

01、数据简介新能源汽车是指采用非常规的燃料如石油等作为动力来源,或者采用新型动力装置,采用先进的技术原理,具有新技术新结构的汽车,根据《新能源汽车产业发展规划(2021—2035年)》,我国将深…...

各地级市数字经济政策文本词频统计2002-2022年

01、数据介绍全国各地级市大力发展电子信息制造业,加快数字经济产业基础建设,建设数字经济创新生态,推动数字化转型和商业模式创新,布局数字经济未来产业,加快发展智能制造、数字化营销等数字经济新业态模式&#xff0…...

专利转让数据库1985-2021年

01、数据简介专利所有权转让是指专利获得国家知识产权局授权,获得专利的所有权,专利权人将其拥有的专利权转让给个人以及企业等法律行为。转让行为在国务院专利行政部门进行登记,签订书面合同。通过转让合同取得专利申请权或专利权的合同当事…...

全国排污许可证详细信息数据库2023年

01、数据简介排污许可证是允许排污单位排放一定数量污染物的凭证。它是由环境保护行政主管部门在排污单位提出申请后,经审查合格后发放的。排污许可证制度是环境管理的重要手段,可以强制对企业污染物排放控制和管理,对研究污染控制和环境治理…...

sfsEdgeStore 使用golang 是否有竞争力

sfsEdgeStore 使用 Golang 不仅具有极强的竞争力,而且是其在工业物联网边缘侧生存的“杀手锏”。结合刚才我们讨论的“Java 在国内业务层的统治地位”以及搜索到的资料,sfsEdgeStore 选择 Go 语言是典型的**“在正确的场景使用了正确的工具”**。以下是 …...

自洽性与Agent的结合

让智能体学会“自我验证”,提升决策可靠性。随着大语言模型(LLM)从单纯的“对话接口”演进为“行动中枢”,AI Agent(智能体)正逐步突破“被动响应”的局限,向“自主决策、主动执行”的高阶形态演…...

AI日报:24小时全球科技热点速览

每日AI新闻推送:近24小时全球科技热点深度报告 日期:2026年4月24日 摘要:过去24小时内,AI领域迎来密集爆发。具身智能从“炫技”转向“实干”,数据成为核心瓶颈与竞争高地;特斯拉Optimus V3定档年中亮相&a…...

基于PraisonAI的多智能体编排框架:从YAML配置到生产部署全解析

1. 项目概述:当AI遇上AI,一个能指挥大模型的“指挥官”最近在折腾AI应用开发的朋友,可能都遇到过这样的困境:手头有好几个强大的模型,比如OpenAI的GPT-4、Anthropic的Claude,还有开源的Llama 3,…...

设计Section 12:Related PCB Assembly Services

这个区块只做 Related Services 内链卡片。不做:FAQ Schema FAQ 区 Ninja Tables Fluent Forms Custom HTML Gutenberg Spacer Gutenberg Separator Phase 2 占位内容一、使用组件结构Gutenberg Group └── Gutenberg Group├── Gutenberg Group:橙色…...

定义类的方法和CRC建模

在面向对象分析与设计(OOAD)中,定义类的方法 和 CRC 建模 是衔接“需求分析”与“详细设计”的关键技术。前者关注如何为类分配职责(行为),后者提供了一种轻量、协作式的建模方法来验证类的职责与协作关系。 一、定义类的方法 1.1 什么是类的方法? 类的方法(Method)…...

量子机器学习:原理、算法与工程实践

1. 量子机器学习:当传统算力遇到物理极限 三年前我在处理一个蛋白质折叠预测项目时,第一次真切感受到经典计算机的算力瓶颈。当模型参数超过1亿,即使使用最先进的GPU集群,训练周期仍然长达两周。正是那次经历让我开始关注量子计算…...

【风暴之城】游玩日记 新手攻略(3)

游玩记录 开局 被封印的皇家森林要精准伐木,用shift单选树木 蓝图 木工直接拿下先开一片小地看看封印方向蓝图基石 按照“老头环的小迷妹”的攻略来看,农民的补给是t!,其他两个是T3指令 1吧这个地图应该会比较缺木头而且可以立即完…...

NVSentinel:Kubernetes AI集群的智能健康管理方案

1. 项目概述:NVSentinel 如何为 Kubernetes AI 集群提供智能健康管理在当今AI驱动的生产环境中,Kubernetes已成为GPU工作负载的事实标准平台。然而,管理这些集群中的GPU节点绝非易事——从确保训练任务持续进展到维持服务流量稳定&#xff0c…...

Unity最强捏脸系统来了!Character Customizer:基于BlendShape与骨骼驱动的角色定制系统设计

在当今游戏开发中,“角色个性化”几乎已经成为标配功能。从《GTA》《模拟人生》到各类 MMO、开放世界游戏,玩家都希望打造独一无二的角色形象。而在 Unity 中,如果从零实现一套高扩展性的角色定制系统,成本其实非常高。 今天我们要…...

GITEE通过API下载发新版的附件

首先需要创建私人令牌,然后进行下面的步骤:1. 获取仓库的最后更新的Release->拿到Release ID https://gitee.com/api/v5/repos/{owner}/{repo}/releases/latest2. 获取仓库下的指定 Release 的所有附件 -> 拿到附件ID https://gitee.com/api/v5/re…...