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

[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.txt
    cmake_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

定义一个类库&#xff0c;定义接口 namespace Plugin {public interface IPlugin{void EllisTest();} }定义另外一个类库&#xff0c;引用上面的类库&#xff0c;实现接口 using Plugin;namespace UserCustom {public class Custom : IPlugin{public void EllisTest(){Conso…...

利用coredump获取程序调用通路

一些前置知识 原文链接&#xff1a;https://blog.csdn.net/tenfyguo/article/details/8159176 一、什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&a…...

DVWA sql手注学习(巨详细不含sqlmap)

这篇文章主要记录学习sql注入的过程中遇到的问题已经一点学习感悟&#xff0c;过程图片会比较多&#xff0c;比较基础和详细&#xff0c;不存在看不懂哪一步的过程 文章目录 靶场介绍SQL注入 lowSQL注入 MediumSQL注入 HighSQL注入 Impossible 靶场介绍 DVWA&#xff08;Damn…...

代码随想录算法训练营第70天图论9[1]

代码随想录算法训练营第70天:图论9 ‍ 拓扑排序精讲 卡码网&#xff1a;117. 软件构建(opens new window) 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的…...

浏览器设计为默认

...

windows USB 设备驱动开发-USB设备描述符

USB的描述符是USB设备向主机报告状态的重要数据结构&#xff0c;在USB通电后&#xff0c;端点(也称为终结点)0始终处于可用状态&#xff0c;这个默认的端点就是用于主机从设备中读取描述符的。 讨论USB通讯&#xff0c;需要从软件和硬件两方面说起&#xff0c;在软件上&#x…...

【踩坑】修复报错Cannot find DGL libdgl_sparse_pytorch_2.2.0.so

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 错误复现 原因分析 解决方法 错误复现 import dgldataset dgl.data.CoraGraphDataset() graph dataset[0] graph.adjacency_matrix() 原因分…...

postman中参数和x-www-form-urlencoded传值的区别

在 Postman 中&#xff0c;传递参数的方式有多种&#xff0c;其中常用的包括 params 和 x-www-form-urlencoded。这两种方式在使用场景和传递数据的方式上有所不同。 1. Params Params 选项用于在 URL 中传递查询参数。这些参数通常用于 GET 请求&#xff0c;但也可以与其他 …...

自己训练 PaddleOCR

打标工具 https://github.com/Evezerest/PPOCRLabel 感谢这位热心网友提供的标注工具&#xff0c;操作非常的方便 只是这个工具有个小坑get_rotate_crop_image&#xff08;&#xff09; 我的标注数据导出时&#xff0c;很多数据变成倒的 hmmmm, 你管我~ if dst_img_height …...

基于SpringBoot的地方废物回收机构管理系统

本系统主要包括管理员和员工两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、员工管理、员工请假管理、销假申请管理、工作日志管理、员工工资管理、员工任务管理、任务汇报管理、设备信息管理、设备借用管理、设备归还管理、设备保修管理、维修入库管理、员工打…...

跑腿平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;基础数据管理&#xff0c;管理员管理&#xff0c;接单详情管理&#xff0c;跑腿员管理&#xff0c;跑腿任务管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;跑腿任务&#xff0c;接单员&…...

Java技术栈总结:Redis篇

一、数据类型 Redis 自身是一个 Map&#xff0c;其中的所有数据均采用“key:value”的形式存储。 数据类型指的是存储的数据的类型&#xff0c;即 value 部分的类型&#xff0c;key 的部分只能是字符串。 value 部分的数据类型&#xff1a;<String、List、Hash、Set、Zse…...

django models对应的mysql类型

Django模型字段类型与MySQL数据库类型的对应关系如下&#xff1a; Django 模型字段类型MySQL 数据库类型AutoFieldBIGINT UNSIGNEDCharFieldVARCHARIntegerFieldINTDecimalFieldDECIMALDateFieldDATEDateTimeFieldDATETIMEFileField, ImageFieldVARCHAR (用于文件路径)Boolean…...

2024攻防演练:亚信安全新一代WAF,关键时刻守护先锋

实网攻防 网络安全如同一面坚固的盾牌&#xff0c;保护着我们的信息资产免受无孔不入的威胁。而其中&#xff0c;WAF就像网络安全的守门员&#xff0c;关键时刻挺身而出&#xff0c;为您的企业筑起一道坚实的防线。 攻防不对等 防守方实时应答压力山大 在攻防对抗中&#xf…...

富格林:曝光有效方案安全交易

富格林认为&#xff0c;近些年来大家的投资理财意识逐渐增强&#xff0c;现货黄金作为一种自带优质避险功能的投资产品&#xff0c;自然就受到投资者的关注和追捧。但现货黄金的交易市场相对来说还是比较混杂&#xff0c;投资小白稍不留神就可能会陷入受害陷阱当中无法安全交易…...

ArtTS系统能力-窗口管理的学习(3.2)

上篇回顾&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 本篇内容&#xff1a; ArtTS系统能力-窗口管理的学习&#xff08;3.2&#xff09; 一、 知识储备 1. 基本概念 窗口渲染式能力&#xff1a;指对状态栏、导航栏等系统窗口进行控制&#xff0c;减…...

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…...

正则表达式替换字符串的方法

正则表达式替换字符串的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一个非常实用的编程技术&#xff1a;使用正则表达式替换字符串。正则…...

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(五)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...