2.C++的编译:命令行、makefile和CMake

1. 命令行编译

命令行编译是指直接在命令行中输入以下指令:

预处理:gcc -E main.c -o main.i
编译:gcc -S main.i -o main.s
汇编:gcc -c main.s -o main.o
链接:gcc main.o -o main
命令汇总:gcc main.c -o main
多文件一起编译:gcc main.c test.c -o main

直接在命令行通过指令来编译的缺点:
这种方法有两个缺点:1, 如果你不小心丢掉了编译指令(比如不小心关掉了terminal)或者换了一个电脑,你就得重新敲一遍编译指令;2,就算你只修改了某一个c文件,你也必须把所有的源文件全部重新编译一次,这个是非常耗时间的,也是完全没有必要的。

2. makefile编译

我们的项目可能会有很多很多的内容需要去进行编译,如何去进行组织成了一个大问题,比如让谁先编译,谁后编译,这时,我们就需要一个构建工具来帮助我们对程序的构建流程进行组织。

Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构键。

要使用Make对我们的项目进行构建,我们需要先告诉Make我们的程序应该如何去进行构建,这时我们就要编写一下Makefile(直接创建名为makefile的文件即可)了:
我们只需要把需要执行的命令按照我们想要的顺序全部写到里面就可以了,但是需要遵循以下格式:

targets:prerequisites
command
  • targets:构建的目标,可以是一个普通的标签、文件名称等
  • prerequisites:前置条件,可以设定要求完成其他目标才能开始构建当前目标
  • command:构建需要执行的命令

一个Makefile中可以有很多个目标,比如我们现在要分别编译main.cpp和test.cpp,那么就需要创建两个目标:

# 执行命令 mingw32-make.exe -f makefile
main.exe: test.o main.o # 目标1:构建最终的程序 依赖于目标2和3 # 链接
	g++ test.o main.o -o main.exe

main.o: main.cpp # 目标2:编译源文件,前置要求有main.cpp  以下命令依次为# 预处理 # 编译 # 汇编
	g++ -E main.cpp -o main.i
	g++ -S main.i -o main.s
	g++ -c main.s -o main.o

test.o: test.cpp # 目标3:编译源文件,前置要求有test.cpp  以下命令依次为# 预处理 # 编译 # 汇编
	g++ -E test.cpp -o test.i
	g++ -S test.i -o test.s
	g++ -c test.s -o test.o

控制台结果:在这里插入图片描述
命令执行的每一步都会详细打印出来,我们可以看到构建确实是按照我们的顺序在进行,并且成功编译出最终目标。

3. Cmake编译

CMake 入门-菜鸟笔记 (coonote.com)
CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。它使用平台无关的配置文件来控制软件编译过程,并生成可在所选编译器环境中使用的项目文件。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式构建他们的软件,这种可以使用各平台的原生构建系统的能力是CMake和其他类似系统的区别之处。
CMake的组态档取名为CMakeLists.txt,并不直接构建出最终的软件,而是产生标准的构建档,然后再依照一般的构建方式使用。

虽然使用Make可以很方便地对项目构建流程进行配置,但是貌似CLion并没有采用这种方式来组织我们的项目进行构建,而是使用了CMake,我们来看看它又是做什么的。

CMke是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者oroject.文件,能测试编译器所支持的C++特性,类似UNⅨ下的automake.

简而言之,CMake是一个跨平台的Makefile生成工具!
实际上当我们创建一个项目后,CLion会自动为我们配置CMake,而具体的配置都是写在CMakeList.txt中的:

cmake_minimum_required(VERSION 3.25)
project(c01_c__)

set(CMAKE_CXX_STANDARD 11)

add_executable(c01_c__ main.cpp main.cpp test.cpp)

我们逐行来进行解读:

  • 第一行使用cmake_minimum_required来指定当前项目使用的CMake最低版本,如果使用的CMakei程序低于此版本是无法构建的。
  • 第二行project:指定项目名称,名称随意,后面的是项目使用的语言,这里缺省(C++).
  • 第三行set用于设定一些环境变量等,这里设定的是C++11标准。
  • 第四行add executable用于指定一个编译出来的可执行文件,这里名称为c01_c__,后面的都是需要编译的源文件(头文件可以不写)

当然除了这些语法之外,还有各种各样的设定,比如设定库目录或是外部动态连接库等,这里就不多说了,感兴趣的可以自行了解。
手动执行cmake需要配置一下环境变量,这里是win中的cmake:
在这里插入图片描述

添加完成后重启CLion,我们输入cmake命令进行生成:

cmake -S . -B test -G “MinGW Makefiles”

其中-S后面的是源文件目录,这里.表示当前目录,-B后面是构建目录,一会构建的文件都在这里面存放,最后-G是选择生成器(生成器有很多,甚至可以直接生成一个VS项目,我们可以直接使用Visual Studio打开),这里我们需要生成Makefile,所以填写"MinGW Makefiles"。
在这里插入图片描述

当然CLion并没有使用Makefile的编译方式,而是Ninja,并且生成的构建文件默认存放在cmake-build-debug中,跟make比较类似但是速度会更快一些,不过最后都会成功构建出我们的可执行程序。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW开发自动读取指针式仪表测试系统

LabVIEW开发自动读取指针式仪表测试系统 在工业领域,尤其是煤矿、变电站和集气站等环境中,指针式仪表因其简单的结构、抗干扰能力强以及能适应高温高压等恶劣环境条件而被广泛应用于设备运行状态监视。然而,传统的人工读表方式不仅成本高昂&…

【Leetcode】移除后集合的最多元素数

目录 💡题目描述 💡思路 💡总结 100150. 移除后集合的最多元素数 💡题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,它们的长度都是偶数 n 。 你必须从 nums1 中移除 n / 2 个元素,同时从 …

SpringMVC源码解析——HTTP请求处理(持续更新中)

在SpringMVC源码解析——DispatcherServlet的逻辑处理中,最后介绍到了org.springframework.web.servlet.DispatcherServlet的doDispatch方法中关于处理Web HTTP请求的核心代码是调用AbstractHandlerMethodAdapter类的handle方法,源码如下: /*…

04-微服务-Nacos

Nacos注册中心 国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.1.认识和安装Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在…

[redis] redis的安装,配置与简单操作

一、缓存的相关知识 1.1 缓存的概念 缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较慢的一方起到加速作用,比如CPU的一级、二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且…

Matlab二维绘图

低级绘图命令line 有什么点就点哪里,然后连起来,没什么细节,不光滑,所以基本不会用到。 x0:0.2*pi:2*pi; ysin(x); line(x,y);%画一条sin函数线 line([-5,5],[2,2]);%画一条水平线 line([5,5],[0,2]);%画一条竖线 高级绘图命令…

1867_noweb简介

Grey 全部学习内容汇总: GitHub - GreyZhang/g_org: my learning trip for org-mode 1867_noweb简介 noweb是一个简单可扩展的文学式编程工具,操作简单且不限制编程语言。 主题由来介绍 本质上来说,我对noweb没有太多的了解欲望。但是我…

5.云原生安全之kubesphere应用网关配置域名TLS证书

文章目录 cloudflare配置使用cloudflare托管域名获取cloudflare API Token在cloudflare中配置SSL/TLS kubesphere使用cert-manager申请cloudflare证书安装证书管理器创建Secret资源创建cluster-issuer.yaml创建cert.yaml申请证书已经查看申请状态 部署harbor并配置ingress使用证…

机器学习笔记 - 基于OpenCV+稀疏光流的无监督运动检测

一、简述 在各种高级开源库的帮助下,检测固定摄像机拍摄的运动行为是轻而易举可以实现的,但检测移动的摄像机拍摄的移动物体的运动检测依然是一个复杂的问题。在这里,我们将继续基于稀疏光流,并检测移动的无人机相机的运动。 这里…

2024年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年道路运输企业主要负责人证考试题库及道路运输企业主要负责人试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人…

STL标准库与泛型编程(侯捷)笔记2

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

企业网盘全方位解读:热门云存储工具的优势与适用场景

企业网盘无疑是当下最热门的企业协同工具。什么是企业网盘?企业网盘与个人网盘又有什么不同呢?一文全方位解读企业网盘这一热门云存储工具。 什么是企业网盘 企业网盘为企业级文件存储、管理与共享平台,企业团队可以在企业网盘中存储企业文…

2024.1.6 关于 Redis 数据类型 Zset 常用命令

目录 Zset 基本概念 Zset 命令操作 ZADD ZRANGE ZREVRANGE ZCARD ZCOUNT ZRANGEBYSCORE ZPOPMAX BZPOPMAX ZPOPMIN BZPOPMIN ZRANK ZREVRANK ZSCORE ZREM ZREMRANGEBYRANK ZREMRANGEBYSCORE ZINCRBY Zset 基本概念 Set(集合) 元素具…

ARM笔记-----输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获,常用的有测量输入信号的脉 宽,和测量 PWM 输入信号的频率和占空比这两种。 输入捕获的大概的原理 当捕获到信号的跳变沿的时候,把计数器 CNT 的值锁存到捕获寄 存器 CCR 中…

各种基础环境搭建

1、Python解释器安装 验证环境变量是否添加成功 winr --> cmd 输入python 会出现的问题 在命令行输入python弹出应用商城 是由于商城的环境变量在python的环境变量前面,移动到最下面就好 C:\Users…\AppData\Local\Microsoft*WindowsApps*

3d全景怎么拍摄?应用领域有哪些?

3d全景技术是综合了VR技术和全景拍摄的一种新型应用技术,通过3D全景技术可以为用户带来720度无死角的观看方式和真实的观看体验,那么3d全景是怎么拍摄制作的呢?应用领域又有哪些呢? 3d全景拍摄制作流程其实不难,常见的…

Linux-文件系统管理实验2

1、将bin目录下的所有文件列表放到bin.txt文档中,并将一共有多少个命令的结果信息保存到该文件的最后一行。统计出文件中以b开头的所有命令有多少个,并将这些命令保存到b.txt文档中。将文档中以p结尾的所有命令保存到p.txt文件中,并统计有多少…

多租户看这一篇就够了

什么是多租户?举个例子:马云、马化腾和刘强东三个人去租房子,他们因为家里经济困难所以勤工俭学,三个人决定合租一套三室一厅的房子,虽然每个人有自己的房间,但是家里的水电、厨房、卫生间和热水器都是大家…

攀登者1 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下…

2、Excel:基础概念、表格结构与常见函数

数据来源:八月成交数据 数据初探 业务背景 数据来源行业:金融行业(根据应收利息和逾期金额字段来判断) 可以猜测: 业务主体:某互联网金融公司(类似支付宝)也业务模式:给…