[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命令时,后面紧跟的目录,一般是工程的根目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt学习:QPushButton组件的使用

QPushButton是Qt库中的一个重要组件&#xff0c;它是用户界面&#xff08;UI&#xff09;设计中常用的一个按钮控件。在Qt程序中&#xff0c;QPushButton用于创建可以在界面上点击响应操作的交互元素。它的主要作用包括&#xff1a; 显示文本或图标&#xff1a;QPushButton通常…

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

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

如何在Ubuntu 14.04上安装和配置Postfix作为仅发送的SMTP服务器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 Postfix 是一个 MTA&#xff08;Mail Transfer Agent&#xff09;&#xff0c;用于发送和接收电子邮件的应用程序。在本教程中&am…

室内效果图渲染要多久?

效果图的渲染时间并非固定&#xff0c;一张效果图的渲染时间可能从几分钟到几小时不等&#xff0c;甚至对于非常复杂和高质量的渲染任务&#xff0c;可能需要几天的时间。影响效果图渲染时间的因素有很多&#xff0c;今天就给大家介绍一下。 电脑配置 一、电脑配置 CPU和GPU…

TensorFlow安装CPU版本和GPU版本

文章目录 前言一、TensorFlow安装CPU版本1.新建虚拟环境2.激活虚拟环境3.下载tensorflow4.验证是否下载成功 二、TensorFlow安装GPU版本1.新建虚拟环境2.激活虚拟环境3.安装tensorflow-gpu4.验证是否下载成功 前言 下载的Anaconda是Anaconda3-2024.02-1-Windows-x86_64版本 一…

Java实现图片的垂直方向拼接

利用Java实现了任意两张图片的垂直方向拼接&#xff0c;不限制大小类型&#xff0c;可直接用于生产。 实现任意两张图片的垂直方向拼接&#xff0c;对于过小图片实现了放大&#xff0c;保证了图片拼接后的清晰度。 对于高度大于宽度的图片&#xff0c;进行了-90度旋转。 impo…

Python缓存利器:cachetools库详解

Python缓存利器:cachetools库详解 1. cachetools简介2. 安装3. 基本概念3.1 LRU Cache (Least Recently Used)3.2 TTL Cache (Time-To-Live)3.3 LFU Cache (Least Frequently Used) 4. 使用示例4.1 使用LRU Cache4.2 使用TTL Cache4.3 使用LFU Cache4.4 缓存装饰器 5. 进阶用法…

Python | Leetcode Python题解之第216题组合总和III

题目&#xff1a; 题解&#xff1a; class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:"""回溯法&#xff0c;对于当前k和n, 枚举元素"""def backtracking(k: int, n: int, ans: List[int]):if k 0 or n <…

django学习入门系列之第四点《案例 博客案例》

文章目录 container面板案例 博客案例往期回顾 container 堆叠到两边 <div class"container-fluid clearfix"><div class"col-sm-9">1</div><div class"col-sm-3">2</div> </div>放在中间 <div clas…

Linux网络服务面试题

1、查看一个网络接口的方法有哪些&#xff1f; ①查看目录/etc/sysconfig/network-scripts/下的网卡对应的配置文件ifcfg-ens33 ②ifconfig ens33 2、如何给一个网络接口设置多个IP地址&#xff1f; 临时配置&#xff1a;ifconfig ens33:1 IP地址 netmask 掩码 up …

机器人外呼相比人工外呼优势有哪些

机器人外呼相比人工外呼的优势主要体现在以下几个方面&#xff1a; 1. 自动化与效率​ - 机器人外呼能够自动拨打大量电话&#xff0c;极大提高了工作效率。例如&#xff0c;一个机器人一天可以打上千个电话&#xff0c;相比之下&#xff0c;人工外呼的数量会有限。 - 机器人可…

算法day02 回文 罗马数字转整数

回文 搞错了String类型的indexOf方法&#xff0c;理解成获取对应下标的值&#xff0c;实际上是在找对应值的下标。 4ms 耗时最少的方法尽量不会去调用jdk提供的方法&#xff0c;而是直接使用对应的数学逻辑关系来处理&#xff0c; 甚至用 代替equals方法。 罗马数字转整数 考…

学习笔记——动态路由——OSPF工作原理(SPF算法)

3、SPF算法 SPF算法(最短路径优先算法&#xff0c;也称Dijkstra算法)由荷兰科学家狄克斯特拉于1959年提出的。 SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离&#xff0c;每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图&#xff0c;该…

Go语言--函数类型、匿名函数和闭包

在Go语言中&#xff0c;函数也是一种数据类型&#xff0c;我们可以通过 type 来定义它&#xff0c;它的类型就是所有拥有相同的参数&#xff0c;相同的返回值的一种类型。 语法 通过type给函数类型起名&#xff0c;然后通过名字进行函数的调用 好处&#xff1a;多态 通过统…

python遍历目录下所有文件

python遍历目录下所有文件 方法1&#xff1a;使用os.walk()函数递归遍历目录下所有文件。方法2&#xff1a;使用os.scandir()函数遍历目录下所有文件。方法3&#xff1a;使用os.listdir()函数遍历目录下所有文件。方法4&#xff1a;使用glob模块遍历目录下所有文件。方法5&…

【大模型】大模型参数量与底层算力资源之间的关系

大模型参数量与底层算力资源之间的关系 大模型参数量与底层算力资源之间的关系引言一、大模型参数量的影响1.1 模型表达能力提升1.2 过拟合风险 二、底层算力资源的挑战2.1 计算资源需求2.2 存储与带宽瓶颈 三、估算模型所需算力资源3.1 基于参数量的估算3.2 考虑硬件效率3.3 实…

查询进程, 并且列出所在路径和端口号

ps -ef | grep port9| grep -v grep | awk {print $2} | while read pid; do # 获取启动目录 start_dir$(pwdx $pid 2>/dev/null | awk {for (i2; i<NF; i) printf "%s ", $i; print ""}) # 获取端口信息&#xff08;使用 ss 命令&#xff0…

【ssh】permission denied, please try again.

ssh执行scp操作时显示 permission denied, please try again. 1.确保被复制文件权限已开 chmod 777 file 2.如果仍未解决直接sudo sudo scp xxx xxx

信息安全驱动汽车行业快速向数字化转型

开发一款安全性良好的软件是困难的&#xff0c;它需要专业知识的积累以及对常见编程缺陷和规则的了解&#xff0c;例如检查输入范围、管理内存分配和回收、寻址字符串格式、避免悬空指针等等。通常情况下&#xff0c;编写安全代码与开发人员编写“流畅”代码的自然愿望形成了对…

【数据库】第7讲 关系数据模型(章节测验)

一. 单选题 1【单选题】下面对于关系的叙述中&#xff0c;不正确的是&#xff08;C&#xff09; A、关系中的每个属性是不可分解的B、在关系中元组的顺序是无关紧要的C、任意的一个二维表都是一个关系D、每一个关系只有一种记录类型 2【单选题】关系模型的完整性约束不包括&…