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.exemain.o: main.cpp # 目标2:编译源文件,前置要求有main.cpp  以下命令依次为# 预处理 # 编译 # 汇编g++ -E main.cpp -o main.ig++ -S main.i -o main.sg++ -c main.s -o main.otest.o: test.cpp # 目标3:编译源文件,前置要求有test.cpp  以下命令依次为# 预处理 # 编译 # 汇编g++ -E test.cpp -o test.ig++ -S test.i -o test.sg++ -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比较类似但是速度会更快一些,不过最后都会成功构建出我们的可执行程序。
在这里插入图片描述

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

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

相关文章

JVM篇:直接内存

直接内存 直接内存并不是JVM的内存结构,直接内存是操作系统的内存,Java本身并不能对操作系统的内存进行操作,而是通过调用本地方法。直接内存常用于NIO作为缓冲区存在,分配成本较高但是读写性能好,并且不受JVM内存回收…

FingerprintService启动-Android13

FingerprintService启动-Android13 1、指纹服务启动1.1 rc启动Binder对接指纹厂商TA库1.2 FingerprintService启动1.2.1 SystemServer启动FingerprintService1.2.2 注册Binder服务fingerprint 2、获取底层信息2.1 AIDL 对接TA中获取2.2 指纹类型判断 android13-release 1、指纹…

PyTorch基础操作

一、Tensor 在 PyTorch 中,张量(Tensor)是一个核心概念,它是一个用于存储和操作数据的多维数组,类似于 NumPy 的 ndarray,但与此同时,它也支持 GPU 加速,这使得在大规模数据上进行科…

CSS 放大翻转动画

<template><div class="container" @mouseenter="startAnimation" @mouseleave="stopAnimation"><!-- 旋方块 --><div class="box" :class="{ rotate-scale-up-hor: isAnimating }"><!-- 元素内…

使用爬虫爬取热门电影

文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下&#xff0c;一个网页里想要显示出一个视频资源&#xff0c;必须有一个<video>标签&#xff0c; <video src"xxx.mp4"&…

Note: A Journey Across Canada

A Journey Across Canada 一场横穿加拿大的旅行 across journey After a quiz last autumn, Kuang crossed the continent eastward to Toronto to visit his schoolmate, the distance measuring approximately 5000 kilometers. 去年秋天一次考试后&#xff0c;Kuang向东穿…

数字人克隆系统开发公司?

广州硅基技术开发限公司是一家位于中国广东省广州市的科技公司。该公司专注于人工智能&#xff08;AI&#xff09;领域的研发和创新。广州硅基以技术创新和解决方案为核心&#xff0c;致力于为客户提供高质量的人工智能产品和服务。 广州硅基技术的主要业务包括但不限于&#…

stm32学习笔记:TIIM-输入捕获

输入捕获理论 4个输入捕获和输出比较通道&#xff0c;共用4个CCR寄存器 另外它们的CH1到CH4&#xff0c;4个通道的引脚&#xff0c;也是共用的。 所以对于同一个定时器&#xff0c;输入捕获和输出比较只能使用其中一个&#xff0c;不能同时使用。 电平跳变&#xff1a;上升沿…

《动手学深度学习》学习笔记 第5章 深度学习计算

本系列为《动手学深度学习》学习笔记 书籍链接&#xff1a;动手学深度学习 笔记是从第四章开始&#xff0c;前面三章为基础知道&#xff0c;有需要的可以自己去看看 关于本系列笔记&#xff1a; 书里为了让读者更好的理解&#xff0c;有大篇幅的描述性的文字&#xff0c;内容很…

Spring学习 Spring概述

1.1.Spring介绍 ​ Spring是轻量级Java EE应用开源框架&#xff08;官网&#xff1a; http://spring.io/ &#xff09;&#xff0c;它由Rod Johnson创为了解决企业级编程开发的复杂性而创建 1.2.简化应用开发体现在哪些方面&#xff1f; IOC 解决传统Web开发中硬编码所造成的…

python中collections.abc.Mapping 和collections.Mapping的区别

文章目录 在 Python 中&#xff0c;collections.abc.Mapping 和 collections.Mapping 都是用于表示映射类型&#xff08;即键值对的集合&#xff0c;例如字典&#xff09;的抽象基类。它们的区别在于它们的来源和使用方式。 collections.abc.Mapping 是 collections.abc 模块中…

1月5日代码随想录完全二叉树的节点个数

222.完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在…

即时设计:轻松实现设计稿动画,打造独具魅力的GIF作品

制作动画 随着动画设计越来越受欢迎&#xff0c;设计师们需要一款强大的工具&#xff0c;以便轻松控制设计稿元素的属性&#xff0c;实现动画效果。今天&#xff0c;我们向您推荐一款具备帧动画功能的设计工具&#xff0c;它可以让您轻松调整元素的宽高、相对位置等属性&#x…

Spring AI 指南

近年来&#xff0c;人工智能技术的迅猛发展改变了我们对科技的看法&#xff0c;并在各个领域引发了巨大的变革。每个人都希望在自己的项目上能够使用人工智能。Spring 框架提供了一个名为 “Spring AI” 的项目&#xff0c;Spring AI 项目旨在简化包含人工智能功能的应用程序的…

Matlab绘制动态心形线

1. 代码 for alpha0:0.1:30 x-1.8:0.001:1.8; y(x.^2).^(1/3)0.9*(3.3-x.^2).^(1/2).*sin(alpha*pi*x); plot(x,y,r-,LineWidth,1.2); set(gca,YGrid,on); axis([-3,3,-2,4]); text(-2,3.35,$f(x)x^{\frac{2}{3}}0.9(3.3-x^2)^{\frac{1}{2}}sin(\alpha\pi x)$,Interpreter,lat…

Geotrust DV通配符证书保护域名数量

Geotrust是一家知名的SSL证书提供商&#xff0c;旗下有多种类型的SSL数字证书&#xff0c;保护网站数据在传输过程中的安全性和完整性&#xff0c;帮助用户确认其网站的安全。通配符SSL证书是Geotrust颁发的一种可以同时保护多个域名站点的SSL证书。今天就随SSL盾小编了解Geotr…

Toshiba 数字隔离器助力工业应用实现稳定的高速隔离数据传输

隔离器件是将输入信号进行转换并输出&#xff0c;以实现输入、输出两端电气隔离的一种安规器件。电气隔离能够保证强电电路和弱电电路之间信号传输的安全性&#xff0c;如果没有进行电气隔离&#xff0c;一旦发生故障&#xff0c;强电电路的电流将直接流到弱电电路&#xff0c;…

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想

上面这封书信是普鲁士数学家哥德巴赫在1742年6月7日写给瑞士数学家欧拉的&#xff0c;哥德巴赫在书信中提出了“任一大于2的整数都可以写成3个质数之和”的猜想。当时&#xff0c;哥德巴赫遵照的是“1也是素数”的约定。现今&#xff0c;数学界已经不使用这个约定了。哥德巴赫原…

Spring Boot 整合 Knife4j(快速上手)

关于 Knife4j 官方文档&#xff1a;https://doc.xiaominfo.com/ Knife4j是一个基于Swagger的API文档生成工具&#xff0c;它提供了一种方便的方式来为Spring Boot项目生成在线API文档。Knife4j的特点包括&#xff1a; 自动化生成&#xff1a;通过Swagger注解&#xff0c;Kn…

凸优化 3:最优化方法

凸优化 3&#xff1a;最优化方法 最优化方法适用场景对比费马引理一阶优化算法梯度下降最速下降 二阶优化算法牛顿法Hessian矩阵Hessian矩阵的逆Hessian矩阵和梯度的区别牛顿法和梯度下降法的区别 拟牛顿法DFP、BFGS/L-BFGS 数值优化算法坐标下降法SMO算法 基于导数的函数优化解…