Linux基本工具——gcc/g++与make/Makefile

news2024/11/27 14:48:10

Linux编译器,项目构成工具

  • gcc/g++
    • 程序翻译过程
    • 选项的含义
    • 动态链接静态链接
    • 如何识别静态链接和动态链接
  • Linux项目自动化构建工具——make/Makefile
    • make/Makefile是什么
    • make/Makefile的使用
    • 伪目标
    • make/makefile推导过程

gcc/g++

程序翻译过程

  1. 预处理(去掉注释,头文件展开,宏替换,条件编译)
  2. 编译(把C语言变成汇编语言)
  3. 汇编(把汇编语言变成二进制,这里不是可以直接执行的二进制)
  4. 链接(把我们写的代码和C便准库中的代码合并起来)

选项的含义

现在来看一下上面各个结果:
预处理
这是测试文件代码
在这里插入图片描述

接下来我们用gcc编译器来运行一下,当然不是要完全编译,而是先让他预处理一下:
在这里插入图片描述
我们用的指令是:

gcc -E test.c -o test.i
-E 从现在开始进行程序翻译到预处理工作完成就停下来
-o 指明形成临时文件的名称(这里是test.i,正常来说预处理完成之后生成的就是后缀为.i的文件)

然后打开test.i来看一下:
在这里插入图片描述
左边是test.c的内容,是我写的,右边是预处理之后的内容,上面的这些内容是头文件展开的内容,其实也就是将库中的内容拷贝过来。
在这里插入图片描述
看右边这里和左边对比,注释那行没了,宏被替换了,条件编译也进行了。
在这里插入图片描述
这是刚才程序的结果。
这里甚至可以在外部进行定义:
在这里插入图片描述
注意:头文件等等都是在你安装编译器的时候一同被安装到编译器的跟目录下,并且头文件最重要的意义就是支持写代码与自动补齐。
编译
在这里插入图片描述
-S 从现在开始完成编译工作,再到全部变成汇编语言停下来。
在这里插入图片描述
这就是编译之后的临时文件的内容。
汇编
在这里插入图片描述
-c 进行程序翻译做完汇编工作,变成可重定向目标二进制之后停下来。
在这里插入图片描述
这里我们已经看不懂了,想看二进制只能od test.o
在这里插入图片描述
虽然说这已经是二进制了,但是也不能被执行。
链接
链接就不需要选项了:
在这里插入图片描述
a.out就是可执行文件了,如果你不喜欢这个文件的名字可以用-o选项。
在这里插入图片描述
这个过程就是将我们的代码和C标准库中的代码结合起来形成可执行二进制程序。

动态链接静态链接

首先要清楚一件事,我们再写代码时用的函数是调用函数,有些时候是调用库函数,我们自己本身没有实现函数的定义。
C标准库是别人写好的代码给我们使用,只有链接的过程才让我们的代码和库里的关联起来。
链接分为动态和静态。
动态链接
在初中的时候,我家的电脑配置很差劲,几乎玩不了什么游戏,只能玩个植物大战僵尸,不过我当时已经玩腻了,想玩玩其他游戏,但是家里电脑配置并不够,后来有年龄比较大的孩子告诉我去网吧,所以就偷偷去网吧玩。
在这里插入图片描述
那么从家里走路需要时间。
在链接的这个阶段,我本身就相当于程序一样,家里电脑不行就要去网吧玩,就相当于你调用的库函数不是你写的只能去调用库里面的函数,告诉我网吧这个地方的大孩子就相当于编译器内部的链接器,在他告诉我的过程就等于在和库进行链接,网吧就是所谓的C标准库,这种库叫做动态库。
动态链接是调用某个函数有某个函数的地址,调用的时候就读取地址然后跳转到地址处。
静态链接
后来我还是觉得去网吧太麻烦,也不安全,所以就和家长商量,给我换了一台高配致电脑。从此就没怎么去过网吧了。
那么这就相当于静态链接:
链接时不产生关联,而是将要使用的内部程序拷贝一份到我的程序里面。
动、静太库的优缺点
那么再来考虑一下,去网吧会有很多麻烦:
1.走路需要时间
2.网吧被查封
3.网吧配置升级
查封或者是升级配置肯定是用不了网吧的电脑了,走路的时间也不短。
好处是人带着一点钱过去就可以了,不用做其他的事情。
那么动态链接的缺点就是耗费时间,但是节省空间。
在家里玩电脑确实很方便,不用走路不用担心网吧被查封,也不用担心网吧配置升级玩不了。
但是家里多了高配置的电脑就需要占空间,电脑桌,电脑椅,显示器,机箱,还有线路还要保养等等。
静态链接的好处是不受库的升级和删除,也节省时间,坏处就是占内存。

如何识别静态链接和动态链接

首先在一个文件里面写这段程序:
在这里插入图片描述
那么怎么区分我写的这段程序是静态还是动态呢?
首先编译一下上面的代码:
在这里插入图片描述
然后用file 加上test.s就能查看时动态还是静态链接了:
在这里插入图片描述
红色框中的叫做动态链接,括号后面的叫做共享库。
在linux下默认生成可执行程序是动态链接。
那么如何查看链接的是哪个库呢?
在这里插入图片描述
括号是库的地址。
在linux下库的命名:

动态库:libxxxxx.so
静态库:libyyyyy.a
他们的命名就是去掉后缀和前缀lib

刚才查看的库就是:
在这里插入图片描述
c标准库。
linux下默认的是使用动态链接。
如果想用静态链接就需要编译后面加上-static:
在这里插入图片描述
静态链接的内存也是非常之大,再用ldd去看的时候就会告诉我们不是靠动态链接执行的。
动态链接
一个程序中多次使用了同一个动态库,这时候不会重复这个动态库,而是只有一个,这也叫做共享库。
所以下载动态链接的c程序就不用再去下载c标准库。
静态链接
静态链接拷贝的时候并不是从动态库中拷贝的,是从静态库中拷贝的。
一般系统是自带动态库,静态库不一定自带。
注意:动态链接只能去动态库找,静态链接只能去静态库拷贝。
系统为了支持编译,提供了标准库.h(这个是告诉我们如何使用),还有动态静态库.so/.a(具体定义,调用,想实现找它们)。
也就是说我们的程序是去.h找静动态链接到别人的库最后才能形成可执行程序。

windows下的动态库和静态库后缀
动态库:.dll
静态库:.lib

Linux项目自动化构建工具——make/Makefile

make/Makefile是什么

make是一个命令,makefile是一个文件。
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作。
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
译,极大的提高了软件开发的效率。

make/Makefile的使用

首先需要先创建makefile这个文件,必须叫这个名字,第一个M可以大写。
在这里插入图片描述
然后用vim打开它进行输入内容:
因为之前test.c中有c语言代码打印hello world
所以我们在makefile中这样写:
在这里插入图片描述
保存退出之后直接用make命令执行这个文件中的内容:
在这里插入图片描述
这时候就发现直接执行了用gcc编译test.c文件。
在这里插入图片描述
也就是说,只要输入make指令,makefile文件中所有的内容都会被执行。
make/Makefile使用原理
makefile是为了构建项目的两个关系。
依赖关系
test.s的来源是从test.c而来,那么test.s就是依赖于test.c。
makefile文件中第一行

test.s : test.c
意思就是test.s依赖于test.c

依赖方法
test.c如何与test.s有依赖关系呢?
第二行就是依赖方法。
依赖方法必须以tab键开头,不能是四个空格键。
后面就是你实现依赖关系的依赖方法的操作。

如果想删除test.s也可以在makefile文件里实现:
在这里插入图片描述
这里依赖关系的clean右边什么都没有就代表没有依赖关系。
但是下面的tab键开头的还是依赖方法。
在这里插入图片描述
如果输入指令make只默认执行第一行的依赖关系和依赖方法,所以想删除需要指定是clean才可以。
当然如果没有删除test.s这个文件再次使用make就会告诉我们这是最新的文件了。
在这里插入图片描述
因为这是相同的文件内容,里面没有被修改过,没必要进行再次执行。
如果想强制执行怎么办呢?

伪目标

在这里插入图片描述

.PHONY:test.s
.PHONY:clean
这两个就是伪目标

保存退出之后再来看看:
伪目标就是用关键字.PHONY:被修饰的对象是为目标,它总会被执行。

那么gcc是如何知道文件不需要这个文件在进行编译了呢?
在这里插入图片描述
首先查看文件的时间信息:

Access :最后一次文件被访问的时间
Modify :最后一次文件被修改的时间
Change:最后一次文件属性改变的时间

这里要说一下被访问的时间不会被访问一次就刷新,因为访问文件的次数是最多的,所以就变成了访问多少次之后才会对这个时间进行修改。
gcc是通过Modify这个时间来判断文件需否需要重新编译的。
在这里插入图片描述
这里用touch重置了test.c,文件里的内容没有被修改,但是时间都被修改了,gcc就能进行重新编译了。

make/makefile推导过程

如果在makefile中写入这样的内容呢?
在这里插入图片描述
这时一个依赖关系列表。
当我们用指令make时会发现:
在这里插入图片描述
makefile里面的命令是倒过来的。
虽然是从上到下扫描,不过这里第一条依赖关系并没有test.o这个文件所以就要去下面找,最后就导致这些指令是从下到上实现。
在makefile文件中运行的机制就是这样的,像栈一样,先进后出,后进先出。
这就是makefile的推导过程。

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

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

相关文章

当了10年程序员,我开窍了

有人说,程序员的高收入和工作年限成正比,认为自己的薪资应该如此计算: private static boolean 计算工资() { //years工作时长(年) int years 5; while(years-- > 0){ 做项目(); 团建活动(); 涨工资(); 拿年终奖(); } return 跳槽() &…

12、后渗透测试--meterpreter使用

Post后渗透模块&#xff1a;在meterpreter > 中我们可以使用以下的命令来实现对目标的操作。一、基本系统命令 sessions # sessions –h 查看帮助sessions -i <ID值> # 进入会话 -k 杀死会话background # 将当前会话放置后台info # 查看已有模块信息getuid …

CSS之段落样式

1、文本缩进 标签&#xff1a;text-indent &#xff08;indent v. 缩进&#xff09;含义&#xff1a;首行缩进和字体大小有关&#xff1a;1个em等于一个字体大小 2、文本对齐方式 标签&#xff1a;text-align (align v. 调整&#xff0c;使一致)种类&#xff1a;左对齐、右对…

AFDet: Anchor Free One Stage 3D Object Detection

论文链接&#xff1a;https://arxiv.org/pdf/2006.12671v1.pdf 前言 在嵌入式系统上操作的高效点云3D目标检测对于包括自动驾驶在内的许多机器人应用来说都是重要的。 大多数以前的工作都试图使用基于Anchor的检测方法来解决这个问题&#xff0c;这些方法有2个缺点&#xff1…

《MySQL的基础语法》

【一】现实当前的数据库 show databases:记住这里的databases是复数形式&#xff0c;你可以简单理解为它不仅仅含有一个数据库&#xff0c;所以需要用到可数名词复数形式。 【二】创建数据库 create database 数据库的名字&#xff1a;记住这里的database用的是单数形式&#…

Django demo项目搭建

安装 Django 在应用程序开发中&#xff0c;分别创建env文件夹和wordspace文件夹。 env文件夹用于存放创建的虚拟环境&#xff0c;wordspace用于存放项目代码&#xff0c;至此实现虚拟环境和应用程序代码的分隔。 步骤1&#xff1a;创建文件夹&#xff0c;创建命令为mkdir en…

静态链接:空间与地址分配

前言 我们终于走到了链接这一步&#xff0c;对于链接这一步&#xff0c;它是将多个输入目标文件链接后输出一个可执行文件。我们拿两个程序a.c和b.c来举例说明链接的过程。 a.c&#xff1a; /* a.c */ extern int shared;int main(){int a 100;swap(&a,&shared); }…

从Mybatis到Mybatis-Plus学习

从Mybatis到Mybatis-PlusMybatis的入门Mybatis的配置解析核心配置文件分页配置注解开发mybatis的执行流程多对一一对多动态SQLmybatis 的缓存Mybatis-plus快速入门mybatis-plus的框架结构图分页查询和删除执行SQL分析打印条件构造器Wrapper代码生成器Mybatis的入门 环境&#…

io复用函数的使用

目录 一、概念 二、使用 1.select系统调用 代码实现 前言&#xff1a; 一般多客户端在和服务器通信时&#xff0c;服务器在执行recv时会先阻塞&#xff0c;然后按照顺序依次处理客户端&#xff0c;无论客户端有无数据都会被处理&#xff0c;这样大大降低了执行效率。此时就引…

代理 模式

代理模式 Proxy Pattern 为其他对象提供一个代理以控制对这个对象的访问 可以详细控制访问某个&#xff08;某类&#xff09;对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。 静态代理 直接写死的代码的代理逻辑 动态代理 动态…

12.2、后渗透测试--令牌窃取

攻击机kali&#xff1a;192.168.11.106靶机windows server 2008 R2&#xff1a;192.168.11.134&#xff08;包含ms17_010漏洞&#xff09;一、令牌简介与原理 令牌(Token) 就是系统的临时密钥&#xff0c;相当于账户名和密码&#xff0c;用来决定是否允许这次请求和判断这次请求…

二进制搭建k8s——部署node节点

上篇&#xff1a;二进制搭建k8s——部署etcd集群和单master 二进制搭建k8s——部署node节点二进制搭建k8s——部署node节点环境部署node节点部署网络组件方法一&#xff1a;部署Flannel方法二&#xff1a;部署 CalicoCNI网络插件介绍Kubernetes的三种网络K8S 中 Pod 网络通信&a…

浅浅讲解下Linux内存管理之CMA

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 Contiguous Memory Allocator, CMA&#xff0c;连续内存分配器&#xff0c;用于分配连续的大块内存。CMA…

c语言内存和文件处理有关知识

内存 分配内存的函数calloc&#xff0c;malloc 定义于头文件 <stdlib.h>功能malloc分配内存(函数)calloc分配并清零内存(函数)realloc扩充之前分配的内存块(函数)free归还还之前分配的内存(函数)aligned_alloc(C11)分配对齐的内存(函数) 函数原型 void *malloc(unsigne…

Java基础之Collection的ArrayList

Java基础之Collection的ArrayList一、add()与addAll()二、remove()三、trimToSize()1、案例一、add()与addAll() 跟C 的vector不同&#xff0c;ArrayList没有push_back()方法&#xff0c;对应的方法是add(E e)&#xff0c;ArrayList也没有insert()方法&#xff0c;对应的方法是…

Oracle---初学篇

Oracle初学篇 Oracle的启动&#xff0c;监听&#xff0c;用户 文章目录Oracle初学篇Oracle的启动Oracle的监听监听服务的主要文件1.listener.ora2.tnsnames.ora3.sqlnet.oraOracle用户Oracle安装成功后默认的三个用户创建用户Oracle的启动 之前写了关于如何在CentOS7上搭建Ora…

2021年全国研究生数学建模竞赛华为杯D题抗乳腺癌候选药物的优化建模求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 D题 抗乳腺癌候选药物的优化建模 原题再现&#xff1a; 一、背景介绍   乳腺癌是目前世界上最常见&#xff0c;致死率较高的癌症之一。乳腺癌的发展与雌激素受体密切相关&#xff0c;有研究发现&#xff0c;雌激素受体α亚型&#xff0…

LeetCode 0547. 省份数量:图的连通分量

【LetMeFly】547.省份数量 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-provinces/ 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a …

Windows文件夹开启大小写敏感

Windows 的文件系统的文件名&#xff0c;是大小写不敏感的&#xff0c;也就是你的文件名是 a.txt 或者 A.txt&#xff0c;在 Windows 中都是一视同仁&#xff0c;认为是同一个文件。 自从 Windows 10 引入 Linux 子系统&#xff08;WSL&#xff09;后&#xff0c;有越来越多开…

JAVA毕业设计——基于ssm的汽车租赁管理系统 (源代码+数据库)

代码地址 https://github.com/ynwynw/carRental-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springboot的汽车租赁管理系统 (源代码数据库)601 一、系统介绍 汽车租赁系统总共分为两个大的模块&#xff0c;分别是系统模块和业务模块。其中系统模…