我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

1. 背景知识

1. 预处理()
2. 编译()
3. 汇编()
4. 连接()

有关具体详解可以参照这篇博客:程序环境与预处理


2. gcc如何完成

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

2.1预处理

📙功能📙

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

📗实例📗

gcc -E text.c -o text.i

📕选项“-E"📕

该选项的作用是让 gcc 在预处理结束后停止编译过程

📘选项“-o"📘

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

接下来我们可以在Linux下来运行:

这样就产生了text.i,我们打开text.i:

定位到最后:

我们不难发现头文件被替换了,注释也被删除了,#define符号的替换以及条件编译。

2.2编译

📙功能📙

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

📗实例📗

gcc –S text.i –o text.s

注意:这里-o text.s 可以省略,编译器会自动给我们生成一个text.s

📕选项“-S"📕

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

我们打开text.s:

不难发现文本中都是一些汇编代码。

2.3 汇编

📙功能📙

汇编阶段是把编译阶段生成的“.s”文件转成目标文件

📗实例📗

gcc –c text.s –o text.o

同理,这里的-o text.o也可以省略

📕选项“-c"📕

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

我们打开text.o:

发现这里面都是乱码,实际是一些二进制代码,被解释出来就是这一堆奇怪的符号。

2.4 链接

📗实例📗

gcc text.o -o text

注意:这里是修改链接后的可执行文件名字为text,不加-o text后系统默认生成可执行文件a.out

当我们运行这段可执行程序:

我们发现程序就能够得到我们想要的结果。

在这里涉及到一个重要的概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc text.o –o text

  • gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

这样我们就能够清晰看见gcc编译是动态链接的。

补充:

C++与C语言在用法上基本类似,只是C++用的是g++编译器,代码编写不同。

gcc选项总结:

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息。

3 总结

本篇博客介绍了在Linux下C/C++程序比较完整的翻译过程,包括了程序的预处理,编译,汇编,链接等知识,如果该文对你有帮助的话能不能3连支持一下博主呢

😘😘😘😘

来源地址:https://blog.csdn.net/m0_68872612/article/details/128547293

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

linux如何用gcc编译

在 Linux 上使用 GCC 编译程序非常简单。以下是一些基本步骤:1. 打开终端并进入你的代码所在的目录。2. 确保你已经安装了 GCC 编译器。你可以在终端输入 "gcc --version" 来检查是否已安装。3. 编写你的 C/C
2023-09-08

linux怎么安装gcc编译器

要在Linux上安装GCC编译器,你可以按照以下步骤进行操作:1. 打开终端窗口。2. 使用以下命令安装GCC编译器及相关的开发工具:- 对于Ubuntu或Debian系统:```sudo apt-get updatesudo apt-ge
2023-09-21

Linux环境使用g++编译C++方法总结

单个源文件生成可执行程序下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: #include int main(i
2022-06-04

redhat linux怎么安装gcc编译器

本篇内容介绍了“redhat linux怎么安装gcc编译器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分两种情况: Linux软件安装通
2023-06-13

linux下使用g++编译cpp工程的方法

C++编程中相关文件后缀1.单个源文件生成可执行程序下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: #include int main(i
2022-06-03

GCC编译工具怎么使用

GCC是一款开源的编译器工具套件,可以用于编译C、C++、Objective-C等程序。下面是GCC编译工具的基本使用方法:1. 安装GCC:首先需要安装GCC编译工具。在Linux系统中,可以通过包管理器安装,例如在Ubuntu中可以使用
2023-09-12

Linux下怎么用GCC编译动态库

这篇文章主要讲解了“Linux下怎么用GCC编译动态库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux下怎么用GCC编译动态库”吧!本文主要解决以下几个问题   1 为什么要使用库?
2023-06-13

linux中怎么使用gcc编译c语言程序

在Linux中使用gcc编译C语言程序,可以按照以下步骤操作:1. 打开终端窗口(Terminal)。2. 进入要编译的C语言程序所在的目录,例如:`cd /path/to/your/c_program`。3. 使用文本编辑器(如vi、na
2023-09-21

linux用gcc编译要注意哪些事项

在Linux上使用gcc编译时,需要注意以下事项:1. 确保已经安装了gcc编译器。可以通过运行命令`gcc --version`来检查是否已经安装。2. 确保要编译的源代码文件存在,并且位于当前目录或者指定的路径下。3. 对于多个源代码文
2023-09-22

GCC为什么用C++来编译

本篇内容介绍了“GCC为什么用C++来编译”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么要用C++在GNU的C++ Conversio
2023-06-17

Ubuntu环境下使用G++编译CPP文件

第一次用g++编译cpp文件的时候报了undefined reference的错误,自定义类中的函数全部都无法找到,查找资料后发现调用的类是需要链接的,本文以一个小例子描述编译的过程。其中class2类调用了class1类的成员函数,依赖于
2022-06-04

ubuntu怎么安装g++编译器

要在Ubuntu上安装g++编译器,可以按照以下步骤进行操作:1. 打开终端,可以通过按下Ctrl + Alt + T组合键来快速打开终端窗口。2. 更新软件包列表。在终端中输入以下命令并按下Enter键:```sudo apt updat
2023-09-21

使用 gcc (mingw32) 编译带有静态库的 DLL

php小编百草为你介绍如何使用gcc (mingw32)编译带有静态库的DLL。在开发过程中,经常需要将静态库打包成DLL以便于在其他项目中调用。使用gcc (mingw32)编译带有静态库的DLL的方法相对简单,只需按照一定的步骤操作即可
使用 gcc (mingw32) 编译带有静态库的 DLL
2024-02-09

Ubuntu 19.10如何将使用GCC 9作为默认编译器

今天就跟大家聊聊有关Ubuntu 19.10如何将使用GCC 9作为默认编译器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。作为我们这一周期一直期待的变化,Ubuntu 19.10升
2023-06-05

Linux系统查看GCC编译器版本命令有哪些

小编给大家分享一下Linux系统查看GCC编译器版本命令有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!GCC编译器是Linux下最常用的C/C++编译器,它
2023-06-28

linux gcc编译CROSSTOOL时出现提示怎么办

linux gcc编译CROSSTOOL时出现提示怎么办,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我目前使用的是UBUNTU的8.04,因为最近一直在升级LINUX,导致目
2023-06-17

编程热搜

目录