Linux学习之基础工具二

news2024/11/26 7:16:23

经过学习我们已经大致的学会了vim的使用,可以利用vim进行代码的编写了,在学习c语言的时候我们就知道,编译完成一个代码需要进行四个步骤:

1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)
4. 连接(生成可执行文件或库文件)

那么在Linux下是如何进行的呢?

通过vim进行代码的编写,通过gcc/g++进行代码的,预处理,编译,汇编链接。

目录

1.Linux编译器-gcc/g++使用

1.什么是gcc?

2. gcc如何实现

预处理(进行宏替换)

编译(生成汇编)

汇编(生成机器可识别代码)

连接(生成可执行文件或库文件)

动静态库的理解与概念

3.Linux项目自动化构建代码

1.make/Makefile是什么?

2.伪目标

3.文件的三个时间属性

4.Makefile的自动推导

5.语法扩展


1.Linux编译器-gcc/g++使用

1.什么是gcc?

GCC(GNU Compiler Collection)是GNU工具链的关键组件,是与GNU、Linux相关项目的标准编译器。它最初仅用于处理C语言,紧接着扩展到C++、Objective-C/C++、Fortran、Java、Go等编程语言。GCC是一个可移植的编译器,支持多种硬件平台,例如ARM、X86等等。GCC不仅是个本地编译器,它还能跨平台交叉编译。

明白了gcc是一个最初 编译c语言的编译器,我们对于g++也就知道是对c++的编译器。

2. gcc如何实现

格式 : gcc [选项] 要编译的文件 [选项] [目标文件]

预处理(进行宏替换)

预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。
预处理指令是以 # 号开头的代码行。
实例 : gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件 ,“ .i”文件为已经过预处理的C原始程序

编译(生成汇编)

在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查
无误后 ,gcc 把代码翻译成汇编语言。
用户可以使用 “-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。
实例 : gcc –S hello.i –o hello.s

汇编(生成机器可识别代码)

汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件
读者在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码了
实例 : gcc –c hello.s –o hello.o

连接(生成可执行文件或库文件)

在成功编译之后 , 就进入了链接阶段。
实例 : gcc hello.o –o hello
对于gcc对于文件的编译指令大致如下图

 -E指向到.i文件完成预处理,-S指向到.s文件实现编译,-c指向到.o文件实现汇编, gcc 加.o文件指向到一个文件 ,最后该文件就是可执行文件。利用./加载到内存中,就可以看到编译的最终结果。

动静态库的理解与概念

在了解之前我们先了解什么是函数库?

在最后链接的过程中:

1.我们现在所写的所有代码都是站在巨人的肩旁上,已经有人帮我们已经写好了对应的接口(函数),即各种函数库。

2.我们知道头文件在哪里,我们可以找到头文件的所在地,那么那些实现方法的函数库又在哪里呢?

我们可以利用ldd指令(可以查找可执行程序所依赖的第三方库)来查找相对应的函数库,.

可以看到它是会依赖一个lib64/libc.so.6的函数库:

可以总结出,在安装软件的时候,系统就已经帮我们安装的乐对应的各种函数库并将它放在特定的路径底下。

头文件提供方法的声明,库文件提供方法的实现

静态库 是指编译链接时, 把库文件的代码全部加入到可执行文件中 ,因此生成的文件比较大,但在运行时也 就不再需要库文件了。其后缀名一般为“.a”
且实际上我们有的静态库是非常少的,他们一般就做拷贝的作用。
动态库 与之相反,在 编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时 链接文件加载库,这样可以节省系统的开销 。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示:
gcc hello.o –o hello 。
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。
我们可以同时利用静态库和动态库分别编译文件:
可以看到生成了两个可执行文件test-s与test-d,两个文件都可以运行。
利用ldd指令发现test-s并不是动态链接。

注意:默认情况下我们的云服务器并不会有静态库的,只有动态库,如有需要则可以安装

c的静态库:

sudo yum isntall glibc-static 

c++的静态库:

sudo yum install -y libstdc++ -static

3.Linux项目自动化构建代码

      在我们用vs写代码时,由于是集成开发工具,包含了对代码一条龙服务的功能,预处理+编译+汇编+链接,但在linux下我们对文件汇编后再接链接要去生成一个重定向的可执行程序,最后在./调用,如果是很多个文件呢,如此操作,太过麻烦,且生成太多的文件我们无从下手,那么如何去将这些文件规划整理呢?

1.make/Makefile是什么?

make:是一个命令符

makefile是一个在当前目录下存在的具有特定格式的文本文件。

对于Makefilede

那么如何去使用呢:

1.首先我们创建一个makefile(名字必须保证是这个,首字母可大写)文件,之后vim打开这个文件

,在此里面写我们要写对应可执行程序的名字,我们这里以一个code.c文件为例:

注意:这是makefile的语法格式,对于一个指令的编写:第一行我们称之为依赖关系,第二行我们称之为依赖方法。我们不能更改它的格式。

第一行写入生成可执行程序名,这里我写入为mybin,冒号和后面接.c文件

第二行先按以下TAB键,而不是四个空格,之后我们gcc编译文件并重定向我们所要给的名字。

这样前两行就完成了一个make的脚本指令。

编译后之后,因为代码在编译错之后改正后重新执行时,我们需要删掉之前生成的可执行程序来重新生成这里我们会引入一个新语法.PHONY。

2.伪目标

.PHONY叫做伪目标,.PHONY修饰clean后,clean就是一个伪目标文件,依赖关系可以为空,依赖方法为rm -f mybin  

目标文件与其他文件差不多,只不过被PHONY修饰后,增加了一个特点:它总是被执行。

       之后我们保存退出,同时使用make clean 指令,可以看到他会执行我们在其中写入的指令.

对于makefile,在调用时,自顶向下扫描,如果遇到第一个目标文件,他会直接执行相关指令。

3.文件的三个时间属性

为了提高编译效率,需要注意的是make是不会允许重复编译我们的文件,这是它特有的,如下:

那这是如何做到的呢,这应该取决于文件的属性--文件的修改时间,可是一个文件的时间怎么就确定了它是旧还是新文件,时间是在增长的,故还是需要去对比。那么和谁去对比呢?理所应当源文件应该和生成的可执行文件的时间来对比,我们可以知道源文件的修改时间时肯定小于生成可执行文件,若文件修改了,则新的时间大于可执行文件的时间,故通过对比两文件时间,确定是否还需要去编译。但有的文件,因为历史问题,修改时间也不会重新编译,需要删除可执行文件才能重新编译。

那么如何去查看一个文件的时间信息?

stat 文件名

我们可以看到文件的基本属性,尤其是这三个文件的时间:

Acess:访问文件的时间(包括打开文件,修改文件等)只要被访问,就会被重新记录。

Modify: 修改文件内容的时间(包括删除,增加),修改文件内容时所记录的时间。

Change:修改文件属性的时间(包括文件大小,权限,时间等),只要被修改,就会记录。

我们知道文件=内容+属性,但对于这里的Change,更改Modify与Acess也会更改Change,换言之,这里的内容修改与访问修改本质上是属性修改的一部分。

当然这里编译时看的就是modify,其次我们自己也可以手动更改时间:

touch  -a 文件名  //更改access time
touch -m  文件名  //更改modify time   修改为当前时间

 通过时间对比,我们可以让代码可以一直被或者不被执行,而PHONY总会被执行,就是不被时间影响,我们可以在makefile中给我们的指令做.PHONY修饰是的可以被一直操作,不受影响

4.Makefile的自动推导

对于make/Makefile是具有依赖性的自动推导能力的,比如:

可以看到,我们直接写的编译.o文件,运行时可以执行,而我们最初是没有.o文件的,我们也没让它生成.o文件,由此判断make是具有自动推导能力的,根据我们的需要自动补充改文件。

完整的应该是这样:

5.语法扩展

1.通过添加@符号,使得执行命令时不打印依赖方法

 make时不再打印gcc test.c -o code.c。

利用这点可以编写一些信息,例如echo不会打印这条指令,执行时打印其中内容,编写信息时更加简洁。

2.利用#注释

3.可编写变量

我们可以理解通过编写变量实现和宏一样的替换效果。

 这段代码的效果和上面的效果一样

4.依赖关系与依赖方法的简写

因为在依赖关系中已经指明了目标文件与源文件,故此可以利用$^代替源文件,使用$@表示目标文件。

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

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

相关文章

晶体三极管型号及结构

晶体三极管型号及结构 晶体三极管常简称为三极管或晶体管。三极管是由两个PN结(PN结的形成及PN结工作原理(单向导电)讲解)构成的一种半导体器件。 其构成有两种型号:一种是PNP型三极管,如下图(a)是PNP型三…

分享一个java+python双版本源码之基于微信小程序的校园跑腿接单系统 校园快递代领小程序(源码、lw、调试)

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

两阶段鲁棒优化matlab实现——CCG和benders

目录 1 主要内容 2 部分代码 3 程序结果 4 程序链接 1 主要内容 程序采用matlab复现经典论文《Solving two-stage robust optimization problems using a column-and-constraint generation method》算例,实现了C&CG和benders算法两部分内容,通过…

Attention Free Transformer(AFT)

Attention Free Transformer(AFT) paper: An Attention Free Transformer date: 2021-05 org: Apple 1 Motivation 原本基于dot product self attention Transformer的时间复杂度和空间复杂度都很高。提出了一个新的AFT层来降低transformer的计算量。 2 Method 2.1 Multi…

论一个优秀的日志采集系统是如何设计和实现数据处理的

作者 观测云 系统开发工程师 李国壮 前言 日志采集系统的执行过程,从 “定位日志” 开始,然后是 “数据采集和处理”,最后则是 “同步采集状态”。本文主要介绍第二项,即数据的采集和解析,其中包含了很多细节处理&am…

Windows10关闭自动更新

0 前言 从Windows Update服务、组策略、计划任务、注册表四个方面入手,目前我这边改完后是可以停止更新的,修改过程中也没遇到其他问题 1 禁用Windows Update服务 ① winR,输入services.msc打开服务 ② 双击打开Windows Update ③ 常规&a…

基于springboot+vue的药店管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

微信开放平台第三方开发,实现代小程序备案申请

大家好,我是小悟 微信小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个…

银河麒麟安装Docker-国产化-九五小庞

银河麒麟高级服务器操作系统 V10 是针对企业级关键业务,适应虚拟化、 云计算、大数据、工业互联网时代对主机系统可靠性、安全性、性能、扩展性和 实时性的需求,依据 CMMI 5 级标准研制的提供内生安全、云原生支持、国产 平台深入优化、高性能、易管理的…

vue基础知识十二:双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Mo…

【基于优化算法的光伏系统】基于光伏系统(由光伏、电池、转换器、PI 控制器、逆变器和充电控制器组成)的 Simulink 模型

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

BF算法(C++)简单讲解

BF算法匹配过程易理解,若匹配,子串和主串都往下移一位。不匹配时,主串回溯至本次匹配开始下标的下一位。例:图中第三趟匹配时,主串到第七位时与子串不匹配,这次匹配主串是从第三位开始的,所以下…

大数据技术准备

Hbase:HBase 底层原理详解(深度好文,建议收藏) - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store,那么这些store在不同的region Hbase写流程(读比写慢) MemStore Flush Hbas…

有名管道实现简易版聊天功能

简单的代码&#xff0c;只能你写一句 我回一句 依次循环 //chat A#include<stdio.h> #include<unistd.h> #include <sys/types.h> #include <sys/stat.h> #include<fcntl.h> #include<string.h> #include<stdlib.h> int main() {//…

SocketTool V4.0 使用说明

TCP/UDP Socket 调 试 工 具 提 供 了 TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种 Socket 调试方案。 下面是一份简要的使用流程&#xff1a; TCP 通信测试&#xff1a; 1) 创建 TCP Server 选中左方的 TCP Server, 然后点击 ”创建 ”按钮&#xff0c;软件弹…

临时工说: 云原生数据库别整新名词,bypass ,不就是旁路吗

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

有史以来最香的日志收集平台是怎样练成的

作者 观测云 系统开发工程师 李国壮 前言 日志采集&#xff08;logging&#xff09;是观测云 DataKit 重要的一项&#xff0c;它将主动采集或被动接收的日志数据加以处理&#xff0c;最终上传到观测云中心。 日志采集的执行过程可大致分为三段&#xff0c;分别是“定位日志”…

听GPT 讲Istio源代码--pilot

File: istio/operator/pkg/translate/translate.go 在Istio项目中&#xff0c;istio/operator/pkg/translate/translate.go文件的作用是处理Istio Operator的配置信息和Kubernetes的资源对象之间的翻译和转换。 首先&#xff0c;scope和componentToAutoScaleEnabledPath是用于记…

趣谈网络协议_1

趣谈网络协议_1 第1讲 | 为什么要学习网络协议&#xff1f;第4讲 | DHCP与PXE&#xff1a;IP是怎么来的&#xff0c;又是怎么没的&#xff1f;动态主机配置协议&#xff08;DHCP&#xff09; 第5讲 | 从物理层到MAC层&#xff1a;如何在宿舍里自己组网玩联机游戏&#xff1f;第…

WPF 如何让xmal的属性换行显示 格式化

WPF 如何让UI的xmal 按照下面的格式化显示 首先格式化显示在VS中的快捷键是 Ctrl &#xff2b;D 然后需要配置&#xff0c;工具 选项 -文本编辑器 -xmal -格式化-间距 更改成如下就可以了