[C++][CMake][生成可执行文件][上]详细讲解
目录
- 0.准备工作
- 1.添加CMakeLists.txt文件
- 2.执行cmake命令
- 3.变量定义
- 4.指定使用的C++标准
- 5.指定输出路径
0.准备工作
- add.c
#include <stdio.h> #include "head.h"int add(int a, int b) {return a+b; } - sub.c
#include <stdio.h> #include "head.h"int subtract(int a, int b) {return a-b; } - mult.c
#include <stdio.h> #include "head.h"int multiply(int a, int b) {return a*b; } - div.c
#include <stdio.h> #include "head.h"double divide(int a, int b) {return (double)a/b; } - head.h
// head.h #ifndef _HEAD_H #define _HEAD_Hint add(int a, int b); int subtract(int a, int b); int multiply(int a, int b); double divide(int a, int b);#endif - main.c
#include <stdio.h> #include "head.h"int main() {int a = 20;int b = 12;printf("a = %d, b = %d\n", a, b);printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", subtract(a, b));printf("a * b = %d\n", multiply(a, b));printf("a / b = %f\n", divide(a, b));return 0; }
1.添加CMakeLists.txt文件
- 在上述源文件所在目录下添加一个新文件
CMakeLists.txtcmake_minimum_required(VERSION 3.0) project(CALC) add_executable(app add.c div.c main.c mult.c sub.c) cmake_minimum_require:指定使用的CMake最低版本- 可选,非必须,如果不加可能会有警告
project:定义工程名称- 并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言)
- 如果不需要这些都是可以忽略的,只需要指定出工程名字即可
# PROJECT 指令的语法是: project(<PROJECT-NAME> [<language-name>...]) project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [DESCRIPTION <project-description-string>] [HOMEPAGE_URL <url-string>] [LANGUAGES <language-name>...])
add_excutable:定义工程会生成一个可执行程序- 这里的可执行程序名和
project中的项目名没有任何关系add_executable(可执行程序名 源文件名称) - 源文件名可以是一个,也可以是多个,如有多个可以用空格或
;分隔# 样式1 add_executable(app add.c div.c main.c mult.c sub.c) # 样式2 add_executable(app add.c;div.c;main.c;mult.c;sub.c)
- 这里的可执行程序名和
2.执行cmake命令
- 将
CMakeLists.txt文件编辑好之后,就可以执行cmake命令了 - 语法:
cmake CMakeLists.txt文件所在路径- 在执行
cmake命令之后,CMakeLists.txt中的命令就会被执行,所以一定要注意给cmake命令指定路径的时候一定不能出错 - 此时,对应目录下会生成一个
makefile文件,此时再执行make命令,就可以对项目进行构建得到所需要的程序了. ├── CMakeCache.txt ├── CMakeFiles ├── Makefile └── cmake_install.cmake
- 在执行
- 注意:
- 如果在
CMakeLists.txt文件所在目录执行了cmake命令之后就会生成一些目录和文件(包括makefile文件) - 如果再基于
makefile执行make命令,程序在编译过程中还会生成一些中间文件和一个可执行文件,这样会导致整个项目目录看起来很混乱,不太容易管理和维护 - 此时可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边
- 比如:将这个目录命名为
build
- 比如:将这个目录命名为
- 如果在
3.变量定义
- 在上面的例子中一共提供了5个源文件,假设这五个源文件需要反复被使用,每次都直接将它们的名字写出来确实是很麻烦,此时就需要定义一个变量,将文件名对应的字符串存储起来
- 在CMake里定义变量需要使用
set - 语法:
[]中的参数为可选项,如不需要可以不写SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])# 方式1: 各个源文件之间使用空格间隔 set(SRC_LIST add.c div.c main.c mult.c sub.c)# 方式2: 各个源文件之间使用;间隔 set(SRC_LIST add.c;div.c;main.c;mult.c;sub.c)add_executable(app ${SRC_LIST})
4.指定使用的C++标准
- 在编写C++程序的时候,可能会用到C++11、C++14、C++17、C++20等新特性,那么就需要在编译的时候在编译命令中制定出要使用哪个标准
g++ *.cpp -std=c++11 -o app - 在CMake中想要指定C++标准有两种方式
- 在
CMakeLists.txt中通过set命令指定set(CMAKE_CXX_STANDARD 11) - 在执行
cmake命令的时候指定出这个宏的值cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
- 在
5.指定输出路径
- 在CMake中指定可执行程序输出的路径,也对应一个宏,叫做
EXECUTABLE_OUTPUT_PATH,它的值还是通过set命令进行设置set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) - 如果指定的目录不存在,会自动生成,无需自己手动创建
- 注意:
- 由于可执行程序是基于
cmake命令生成的makefile文件然后再执行make命令得到的 - 如果此处指定可执行程序生成路径的时候使用的是相对路径
./xxx/xxx,那么此处的./对应的就是makefile文件所在的那个目录
- 由于可执行程序是基于
PROJECT_SOURCE_DIR宏对应的值是在使用cmake命令时,后面紧跟的目录,一般是工程的根目录
相关文章:
[C++][CMake][生成可执行文件][上]详细讲解
目录 0.准备工作1.添加CMakeLists.txt文件2.执行cmake命令3.变量定义4.指定使用的C标准5.指定输出路径 0.准备工作 add.c#include <stdio.h> #include "head.h"int add(int a, int b) {return ab; }sub.c#include <stdio.h> #include "head.h"…...
Asp.net Core 反射加载dll
定义一个类库,定义接口 namespace Plugin {public interface IPlugin{void EllisTest();} }定义另外一个类库,引用上面的类库,实现接口 using Plugin;namespace UserCustom {public class Custom : IPlugin{public void EllisTest(){Conso…...
利用coredump获取程序调用通路
一些前置知识 原文链接:https://blog.csdn.net/tenfyguo/article/details/8159176 一、什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&a…...
DVWA sql手注学习(巨详细不含sqlmap)
这篇文章主要记录学习sql注入的过程中遇到的问题已经一点学习感悟,过程图片会比较多,比较基础和详细,不存在看不懂哪一步的过程 文章目录 靶场介绍SQL注入 lowSQL注入 MediumSQL注入 HighSQL注入 Impossible 靶场介绍 DVWA(Damn…...
代码随想录算法训练营第70天图论9[1]
代码随想录算法训练营第70天:图论9 拓扑排序精讲 卡码网:117. 软件构建(opens new window) 题目描述: 某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的…...
浏览器设计为默认
...
windows USB 设备驱动开发-USB设备描述符
USB的描述符是USB设备向主机报告状态的重要数据结构,在USB通电后,端点(也称为终结点)0始终处于可用状态,这个默认的端点就是用于主机从设备中读取描述符的。 讨论USB通讯,需要从软件和硬件两方面说起,在软件上&#x…...
【踩坑】修复报错Cannot find DGL libdgl_sparse_pytorch_2.2.0.so
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 错误复现 原因分析 解决方法 错误复现 import dgldataset dgl.data.CoraGraphDataset() graph dataset[0] graph.adjacency_matrix() 原因分…...
postman中参数和x-www-form-urlencoded传值的区别
在 Postman 中,传递参数的方式有多种,其中常用的包括 params 和 x-www-form-urlencoded。这两种方式在使用场景和传递数据的方式上有所不同。 1. Params Params 选项用于在 URL 中传递查询参数。这些参数通常用于 GET 请求,但也可以与其他 …...
自己训练 PaddleOCR
打标工具 https://github.com/Evezerest/PPOCRLabel 感谢这位热心网友提供的标注工具,操作非常的方便 只是这个工具有个小坑get_rotate_crop_image() 我的标注数据导出时,很多数据变成倒的 hmmmm, 你管我~ if dst_img_height …...
基于SpringBoot的地方废物回收机构管理系统
本系统主要包括管理员和员工两个角色组成;主要包括:首页、个人中心、员工管理、员工请假管理、销假申请管理、工作日志管理、员工工资管理、员工任务管理、任务汇报管理、设备信息管理、设备借用管理、设备归还管理、设备保修管理、维修入库管理、员工打…...
跑腿平台小程序的设计
管理员账户功能包括:系统首页,个人中心,基础数据管理,管理员管理,接单详情管理,跑腿员管理,跑腿任务管理 微信端账号功能包括:系统首页,跑腿任务,接单员&…...
Java技术栈总结:Redis篇
一、数据类型 Redis 自身是一个 Map,其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型,即 value 部分的类型,key 的部分只能是字符串。 value 部分的数据类型:<String、List、Hash、Set、Zse…...
django models对应的mysql类型
Django模型字段类型与MySQL数据库类型的对应关系如下: Django 模型字段类型MySQL 数据库类型AutoFieldBIGINT UNSIGNEDCharFieldVARCHARIntegerFieldINTDecimalFieldDECIMALDateFieldDATEDateTimeFieldDATETIMEFileField, ImageFieldVARCHAR (用于文件路径)Boolean…...
2024攻防演练:亚信安全新一代WAF,关键时刻守护先锋
实网攻防 网络安全如同一面坚固的盾牌,保护着我们的信息资产免受无孔不入的威胁。而其中,WAF就像网络安全的守门员,关键时刻挺身而出,为您的企业筑起一道坚实的防线。 攻防不对等 防守方实时应答压力山大 在攻防对抗中…...
富格林:曝光有效方案安全交易
富格林认为,近些年来大家的投资理财意识逐渐增强,现货黄金作为一种自带优质避险功能的投资产品,自然就受到投资者的关注和追捧。但现货黄金的交易市场相对来说还是比较混杂,投资小白稍不留神就可能会陷入受害陷阱当中无法安全交易…...
ArtTS系统能力-窗口管理的学习(3.2)
上篇回顾: ArtTS系统能力-通知的学习(3.1) 本篇内容: ArtTS系统能力-窗口管理的学习(3.2) 一、 知识储备 1. 基本概念 窗口渲染式能力:指对状态栏、导航栏等系统窗口进行控制,减…...
C++ 运算符的优先级和关联性表
C 运算符的优先级和关联性表 1. Precedence and associativity (优先级和结合性)2. Alternative spellings (替代拼写)3. C operator precedence and associativity table (C 运算符的优先级和关联性表)References C documentation (C 文档) https://learn.microsoft.com/en-us…...
正则表达式替换字符串的方法
正则表达式替换字符串的方法 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一个非常实用的编程技术:使用正则表达式替换字符串。正则…...
开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(五)
一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…...
基于机器视觉与机器学习的化学分析自动化:从颜色反应到浓度预测
1. 项目概述:当化学分析遇上人工智能 在实验室里,我们常常依赖一些经典的“颜色反应”来判断物质的浓度。比如,用碘化钾溶液检测水中的总氧化剂——溶液从无色逐渐变成黄色、棕色,颜色越深,氧化剂浓度越高。这个方法叫…...
5分钟上手!Linux用户必备的Apple Emoji字体安装教程
5分钟上手!Linux用户必备的Apple Emoji字体安装教程 【免费下载链接】apple-emoji-ttf Brings Apples vibrant color emojis to Linux, Windows, and the Web 项目地址: https://gitcode.com/gh_mirrors/ap/apple-emoji-ttf apple-emoji-ttf项目能够为Linux和…...
通过Hermes Agent对接Taotoken自定义模型提供方
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Hermes Agent对接Taotoken自定义模型提供方 Hermes Agent是一个流行的AI Agent开发框架,它支持通过统一的接口调用…...
喜马拉雅xm-sign v3算法逆向解析与Node.js本地生成
1. 这不是“爬虫教程”,而是一次对前端签名机制的解剖式复现你有没有遇到过这样的情况:抓包看到喜马拉雅App或网页端发起的请求里,总带着一个叫xm-sign的参数,长度固定32位,每次请求都变,但又不是纯随机——…...
新手教程使用curl命令快速测试Taotoken的OpenAI兼容接口
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手教程:使用curl命令快速测试Taotoken的OpenAI兼容接口 基础教程类,面向刚注册Taotoken的开发者…...
GitHub星标超50k的开源AI工具,为何大厂仍每年豪掷千万采购商业套件?(20年AI基建老兵深度复盘)
更多请点击: https://intelliparadigm.com 第一章:GitHub星标超50k的开源AI工具,为何大厂仍每年豪掷千万采购商业套件?(20年AI基建老兵深度复盘) 开源AI工具如LangChain、LlamaIndex、Ollama和Hugging Fac…...
小微团队如何利用Taotoken管理多个项目的AI成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 小微团队如何利用Taotoken管理多个项目的AI成本 对于创业团队或小微企业而言,在拥抱大模型能力的同时,如何…...
JMeter并发与持续性压测:从瞬时吞吐到系统韧性的工程实践
1. 为什么“并发持续”不是简单叠加,而是压测成败的分水岭 很多人第一次做接口性能测试时,会下意识把JMeter当成“高级curl”——写个HTTP请求,加个线程组,跑50个用户,看响应时间飘不飘。结果报告一出来,平…...
2026年在湖南选智能家居,有线和无线究竟该怎么选?
引言随着智能家居的普及,在湖南选择智能家居时,有线和无线方案的抉择成为许多消费者头疼的问题。华为鸿蒙智家株洲红星店凭借多年的行业经验和专业知识,为大家提供一些有价值的参考,帮助大家在2026年做出更合适的选择。有线智能家…...
机器学习数据安全新视角:高价值样本的脆弱性与差异化防御策略
1. 项目概述与核心问题在机器学习的实际部署中,我们常常面临一个看似矛盾的局面:那些对模型性能提升贡献最大的“高价值”数据,是否也恰恰是系统中最脆弱的环节?这个问题在过去几年里一直萦绕在我的心头。无论是构建一个图像分类器…...
