前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Linux编译器-gcc/g++使用

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

作者头像
绝活蛋炒饭
发布于 2024-12-16 07:59:56
发布于 2024-12-16 07:59:56
3010
举报
文章被收录于专栏:绝活编程学习绝活编程学习

1. 背景知识

        1. 预处理(进行宏替换)

        2. 编译(生成汇编)

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

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

2. gcc如何完成

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

先写好自己的文件,利用gcc编译好后会在当前目录下形成一个a.out文件,这个就是编译好的可执行程序。(上面程序有点小问题,格式不太好看) 

gcc在编译的时候,后面加上-o,就可以指定生成文件的名字。 

C语言可以用gcc和g++编译。c++只能用g++编译。 

3.顺便讲解一下程序的翻译过程 

3.1预处理(进行宏替换)

预处理功能主要包括头文件展开 ,宏定义 ,去注释,条件编译等。

预处理指令是以 # 号开头的代码行。

实例 : gcc –E hello.c –o hello.i

选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。

选项 “-o” 是指目标文件 ,“.i” 文件为已经过预处理的 C 原始程序

头文件展开,宏定义,去注释的演示

上面的代码,在经过预处理后,生成了下面的文件

-E的意思就是,从现在开始程序编译,直到预处理停下。

所谓的头文件展开,就是把头文件在原文件里拷贝到原文件。 所以,我们看到了原本的几行代码,变成了几百行代码。

条件编译的演示 

这个就是上面代码的运行过程

这个就是代码的经过预处理后的代码,一些未满足条件的代码,就直接未编译。 

我们将两个宏定义直接全部注释 。

 用 -D选项可以对编译器传递不同的宏值。在结合条件编译,可以对代码进行动态裁剪。

 我们对编译器传递了verson2=2,这样的话,条件编译就只编译verson2=2的部分

应用:VS 的免费版和专业版 其实两个版本就是软件,免费版就是一部分的专业版。在维护的时候就只要维护一份代码。在程序内部利用类似条件编译的功能来对软件功能进行裁剪。 

编译(生成汇编)

在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查

无误后 ,gcc 把代码翻译成汇编语言。(此时C语言文件变成了汇编文件)

用户可以使用 “-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。

实例: gcc –S hello.i –o hello.s

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

汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件(可重定目标的二进制文件)(但是不可执行)

读者在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码了

实例 : gcc –c hello.s –o hello.o

变成二进制文件,vim无法查看,变成乱码了。 

此时,二进制文件依旧无法执行。  

此时,只是将自己写的代码变成了二进制文件,包含在头文件里的被我们使用的函数未被编译成二进制,所以还无法执行。 

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

在成功编译之后 , 就进入了链接阶段。

实例 : gcc hello.o –o hello

 我们在代码中使用一些库函数,我们并没有实现库函数,所以我们需要去连接库。 但是我们再使用gcc的时候并没有使用选项,来指明库,这是为什么? 这是因为gcc默认连接C语言标准库。我们来查看一下。


4.补充知识:语言与编译器的自举过程

C语言编译器优化成V2----->用C语言编译器v1编译------->v2形成软件(语言的自举) 

那么:程序在翻译的过程,是翻译成低级语言,还是直接翻译为二进制文件?           站在巨人的肩膀上,翻译成低级语言,然后再用低级语言翻译成二进制文件。 


5.补充知识:动静态库 

不同系统下动静态库的后缀

动态库就需要:动态链接 静态库就需要:静态链接 

当然,在动态链接的时候,动态库可以被多个可执行程序同时访问。 

动态库是被所有人共享的。同样的,一旦动态库缺失了,所以程序也都无法运行了!!! 

静态链接: 

就是把代码里需要用到的库函数从静态库里拷贝一份到可执行程序里就是静态链接。(从此之后,这份代码就是独立的,不会受到库缺少的影响)。

静态库与动态库

动静态库的本质就是文件,头文件也是文件。 允许你进行拷贝的库就是静态库。 允许你进行关联的库就是动态库。 

动静态库的优缺点

动态库的优点         :比较节省资源,不会出现太多重复代码 。当自己的一份代码出现多个相同的库函数时,不需要每一个都拷贝一份库函数,只需要在动态库中有一份,能够形成链接就行。( 这里的资源不仅仅是储存这份代码时的磁盘资源,也是代码加在进入内存的内存资源,还有别人在下载你的代码时的网卡资源。这里的资源是系统性的,不仅仅节省单一资源) 动态库的缺点         :对库的依赖性比较强。一旦库丢失,所有使用这个库的程序都无法运行。         :效率相对低下,和静态库比较(不是主要矛盾)

静态库的优点         :不依赖库,同类型平台上都可以直接运行。会把代码拷贝到可执行程序内。 静态库的缺点         :可执行程序代码比较大,比较浪费资源

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux】Linux编译器gcc/g++的使用
头文件拷贝,去注释,条件编译,宏替换 -E让程序翻译到预处理阶段就停下来,-o指明形成的临时文件名称。
举杯邀明月
2023/04/12
2.3K0
【Linux】Linux编译器gcc/g++的使用
【Linux】Linux编译器-gcc/g++使用
此时生成test.i,我们用vim进入test.i,在利用底行模式vs test.c:
平凡的人1
2022/11/15
2.2K0
【Linux】Linux编译器-gcc/g++使用
【Linux篇】基础开发工具-编译器gcc/g++
 在Liunx中存在着两种编译器gcc/g++,gcc是只用来编译c语言的编译器,而g++可以编译c/c++。 程序的翻译过程需要经历四个步骤:预处理,编译,汇编,链接。
_孙同学
2024/12/25
1750
【Linux篇】基础开发工具-编译器gcc/g++
深度解析Linux中的编译器gcc/g++
我们需要进入到/etc/sudoers这个文件里面,我们需要使用我们的root账户,不然得话我们进去之后什么都看不见的
凯子坚持C
2025/01/17
1560
深度解析Linux中的编译器gcc/g++
Linux编译器-gcc/g++使用
进入test.i后发现居然有800多行代码,这是为什么呢?因为预处理阶段会进行头文件展开,就是将c语言中写好的头文件拷贝到这个test.i中,这就是头文件的展开。
用户10923087
2024/01/23
2140
Linux编译器-gcc/g++使用
【Linux】手把手教你从零上手gcc/g++编译器
然后我们使用gcc的只激活预处理选项,将生成的文件定向输入到新文件test.i中:
修修修也
2024/08/17
1830
【Linux】手把手教你从零上手gcc/g++编译器
【Linux】编译器-gcc/g++使用
在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。
zxctscl
2024/03/10
2320
【Linux】编译器-gcc/g++使用
编译器gcc/g++ --【Linux基础开发工具】
• 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后, gcc 把代码翻译成汇编语言。
小志biubiu
2025/02/27
3290
Linux编译器---gcc/g++使用详解
更加详细的介绍,可以参照这篇博客:C语言翻译环境:预编译+编译+汇编+链接详解-CSDN博客
P_M_P
2024/02/24
9040
Linux编译器---gcc/g++使用详解
【Linux】编译器-gcc/g++
我们直接用自带的gcc编译器会编译不了,因为当前版本太低了,有些语法不支持。此时需要带个选项 -std=c99,让他支持c99标准就可以了,如下图:
秦jh
2024/05/07
1540
【Linux】编译器-gcc/g++
Linux编译器-gcc/g++使用
gcc mycode.c -0 mytest,后,./mytest就可以编译了,相当于把a.out重命名了
ljw695
2024/10/18
1250
Linux编译器-gcc/g++使用
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识
gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。
YIN_尹
2024/01/23
2.2K0
【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识
Linux基础——Linux开发工具(中)_gcc/g++
前言:在上一篇我们简单介绍了yum,vim的一些常用的指令和模式,现在让我们来进一步了解其他的Linux环境基础开发工具gcc/g++,gdb。
Eternity._
2024/06/14
1850
Linux基础——Linux开发工具(中)_gcc/g++
Linux编译器-gcc/g++
gcc/g++是Linux中的编译器,vim是Linux中的编辑器。要想将代码运行起来还需要编译才可实现。 本篇文章,主要通过预处理、编译、汇编、链接来介绍gcc/g++。
南桥
2024/01/27
2250
Linux编译器-gcc/g++
Linux中的yum和gcc/g++
在Linux中,我们也要进行工具/指令/程序、安装、检查、卸载等等,需要使用到yum
用户11316056
2024/10/16
1270
Linux中的yum和gcc/g++
Linux中编译器-gcc/g++的使用
上面的过程对应的选项正好对应键盘左上角 Esc 按键, 方便我们进行记忆, 不过E S 大写, c小写
用户11317877
2024/11/15
1960
Linux中编译器-gcc/g++的使用
Linux下Centos7中的gcc/g++
可能对于没有配置过的centos来说,会无法编译成功。为什么呢?那是由于gcc的版本在默认的情况之下是取了一个适中的版本,不算太新,正好又不能编译for循环,所以导致这样不能进行编译。 如果想要编译的话,可以根据提示信息,进行改写一下gcc命令
薛定谔方程难
2024/07/27
1050
Linux下Centos7中的gcc/g++
程序翻译过程详解
        gcc和g++都是编译器,C语言可以用gcc或者是g++来进行编译,但推荐使用gcc来进行编译。但C++语言只能用g++编译器来进行编译。
用户10923276
2024/03/28
1190
程序翻译过程详解
【linux学习指南】Linux编译器 gcc和g++使用
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
学习起来吧
2024/09/11
2840
【linux学习指南】Linux编译器 gcc和g++使用
【Linux】gcc&g++与 [ 动静态库 ] 的美妙邂逅(5)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查 无误后,gcc 把代码翻译成汇编语言。
YY的秘密代码小屋
2024/01/22
2290
【Linux】gcc&g++与 [ 动静态库 ] 的美妙邂逅(5)
相关推荐
【Linux】Linux编译器gcc/g++的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档