Linux编译器 gcc与g++

这篇具有很好参考价值的文章主要介绍了Linux编译器 gcc与g++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux编译器 gcc/g++工具

1、程序的诞生

程序的编译过程:

1、预处理(头文件包含、消除注释、宏定义替换)

2、编译(将语言替换成汇编代码)

3、汇编(将汇编指令转换为二进制指令)

4、链接(合并段表、符号表合并及重定位)

Linux编译器 gcc与g++

2、gcc工具

我们可以通过gcc工具实现程序的编译过程:

Linux编译器 gcc与g++

2.1 预处理

预处理会完成:①头文件包含,②define定义符号的替换和删除定义的符号,③删除注释

语法:

gcc [选项] [文件名] [选项] [生成文件名]

选项:

  • -E:该选项的作用是让gcc在预处理结束后停止编译过程;
  • -o:指明生成的目标文件

使用gcc进行预处理:

gcc -E Test.c -o Test.i

这里预处理程序Test.c,生成预处理后的文件并命名为Test.i;由于Linux文件类型与后缀无关,因此这里命名文件后缀名是为了方便用户明确其文件类型

Linux编译器 gcc与g++

2.2 编译

gcc首先要检查代码的规范性,是否有语法错误等,然后把C语言代码转换成汇编代码

语法:

gcc [选项] [文件名] [选项] [生成文件名]

选项:

  • -S:只进行编译而不进行汇编,生成汇编代码。
  • -o:指明生成的目标文件

使用gcc对已经预处理的文件进行汇编:

gcc -S Test.i -o Test.s

Linux编译器 gcc与g++

2.3 汇编

在汇编阶段会把汇编代码转换成二进制指令,同时会形成符号表

语法:

gcc [选项] [文件名] [选项] [生成文件名]

选项:

  • -c:汇编代码转化为.o的二进制目标代码
  • -o:指明生成的目标文件

使用gcc对已经完成编译的文件进行汇编:

gcc -c Test.s -o Test.o

Linux编译器 gcc与g++

我们使用vim编辑器查看Test.o文件:

vim Test.o

Linux编译器 gcc与g++

可以看到已经将汇编文件转化为二进制代码了,我们已经看不懂了

2.4 链接

链接的作用是将汇编完成后的二进制文件生成可执行文件

语法:

gcc [文件名] [选项] [生成文件名]

默认情况生成a.out,可以使用-o选项指明生成的目标文件:

gcc Test.o -o test 

Linux编译器 gcc与g++

也可以直接默认生成:

gcc Test.o

Linux编译器 gcc与g++

2.5 运行

当我们完成预处理—>编译—>汇编—>链接步骤后得到了我们的可执行文件,此时我们通过./来运行该可执行文件即可:

./a.out
./Test.exe

Linux编译器 gcc与g++

2.6 总结

以上我们通过gcc工具,通过四个步骤最终实现了程序的编译过程,最终得到可执行文件:

Linux编译器 gcc与g++

其中选项含义:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面;
  • -S 编译到汇编语言不进行汇编和链接;
  • -c 编译到目标代码;
  • -o 文件输出到文件;

👉 以上四个步骤我们可以通过gcc一步完成:

gcc hello.c                  #直接生成可执行文件

默认生成a.out可执行文件,也可通过-o选项重新命名:

gcc hello.c -o hello.exe     #将可执行文件命名为hello.exe

Linux编译器 gcc与g++

3、静态链接与动态链接

例如当我们使用printf函数时,是直接使用的库函数,库函数的代码在库文件中,因此库文件在何时,以怎样的方式加入到我们的程序当中的呢?下面我们将探讨这个问题。

3.1 静态链接

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

优势:不受库升级或者被删除的影响;
劣势:形成的可执行程序体积太大,浪费资源(可能在网络、磁盘、内存上占用了很大的资源)。

3.2 动态链接

动态链接与静态相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库文件。动态链接链接动态库,其后缀一般为.so。

优势:形成的可执行程序体积小,很好地节省资源(网络、磁盘、内存);
劣势:受库升级或者被删除的影响

例如我们以hello world程序为例:

gcc hello.c -o hello       #编译程序
file hello                 #查看该可执行程序

Linux编译器 gcc与g++

即:dynamically linked

可知Linux下使用的是动态链接!

ldd hello                  #查看动态链接库

Linux编译器 gcc与g++

3.3 Linux下库的命名

动态库:

libxxxxx.so 去掉前缀lib,去掉后缀.so,剩下的即是该库名

例如刚刚我们查看的静态链接库:

Linux编译器 gcc与g++

静态库:

libyyyyy.a 去掉前缀lib,去掉后缀.a,剩下的即是该库名

需要注意的是,Linux下静态链接需要使用静态库,而操作系统中可能没有对应的静态库,需要下载:

sudo yum install -y glibc-static         #下载C标准静态库
sudo yum install -y libstdc++-static     #下载C++标准静态库 
sudo yum install -y gcc-c++              #下载g++

由于Linux下链接步骤默认为动态链接,因此在下载完静态库后我们可以通过-static指令实现静态链接:

gcc hello.c -o hello_static -static

Linux编译器 gcc与g++

可以看到同一个程序通过动态链接和静态链接形成的可执行文件体积大小差别极大(100倍)!文章来源地址https://www.toymoban.com/news/detail-417599.html

到了这里,关于Linux编译器 gcc与g++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux编译器——gcc/g++使用

    前言:  在上一篇,我们学习了关于文本编辑器 vim 的全部知识,今天给大家带来的是关于Linux编译器—gcc/使用的详细介绍。 本文目录  (一)温习程序的产生的过程 1、前言 2、程序的产生过程 3、🌜初步认识 gcc🌛 a) gcc的基本概念 b)gcc的基本特点 4、使用方法💻 (二)

    2023年04月17日
    浏览(55)
  • Linux--编译器-gcc/g++使用

    目录 前言 1.看一段样例  2.程序的翻译过程 1.第一个阶段:预处理 2.第二个阶段:编译 3.第三个阶段:汇编 4.第四个阶段:链接 3.程序的编译为什么是这个样子? 4. 关于编译器 5.链接(动静态链接) 1.首先,我们来看一段样例(见一下) 2.见完之后,我们来看一下程序的翻译

    2024年02月20日
    浏览(63)
  • 【Linux】编译器-gcc/g++使用

    个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 在之前已经分享了 【Linux】vim的使用,这次来看看在云服务器上的编译器gcc。 我们先写一段简单的代码: 当我们进行编译的时候: 发现根本就编译不了。 这个是因为编译器版本的问题: 查看编译器的版

    2024年03月11日
    浏览(129)
  • Linux编译器 gcc与g++

    程序的编译过程: 1、 预处理 (头文件包含、消除注释、宏定义替换) 2、 编译 (将语言替换成汇编代码) 3、 汇编 (将汇编指令转换为二进制指令) 4、 链接 (合并段表、符号表合并及重定位) 我们可以通过gcc工具实现程序的编译过程: 2.1 预处理 预处理会完成:①头

    2023年04月18日
    浏览(74)
  • Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

    前言: 本文主要认识与学习 Linux 环境下常用的编译器—— gcc (编译 C 代码)/ g++ (编译 C++ 代码)的常用指令等、程序实现的两大环境、动态库与静态库的理解等。 任何一个 C 程序的实现都要经过 翻译环境 与 执行环境 。 在翻译环境中又分为4个部分, 预编译、编译、汇

    2024年02月13日
    浏览(46)
  • [linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

    目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序  ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译  c.汇编  d.链接 ③.执行Main 二进制可执行程序(.exe文件)  三.总结  使用yum命令(相当于手机上的应用市场)来进行安装.  下载完毕之后,使用 which gc

    2024年04月10日
    浏览(59)
  • Linux的学习之路:6、Linux编译器-gcc/g++使用

    本文主要是说一些gcc的使用,g++和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译(生成汇编) 3、汇编(生成机器可识别代码 4、链接(生成可执行文件或库文件) 5、函数库 6、静态库和动态库 7、gcc选项 三、思维导图

    2024年04月23日
    浏览(50)
  • 【Linux环境基础开发工具】编译器-gcc/g++

    上一篇博客, 我们学习了vim编辑工具,学会了怎么写代码, 这篇文章,我将分享代码该怎么编译的问题。 目录 写在前面: 1. gcc和g++介绍 2. gcc是如何编译程序的 1. 预处理 2. 编译 3. 汇编 4. 链接 3. gcc的选项介绍 4. 我们使用的函数是哪来的 5. 我们的.o文件和库是如何链接的?

    2024年02月10日
    浏览(50)
  • 如何在 Linux 上安装 C 和 GCC 编译器?

    Linux 是一组开源的类 UNIX 操作系统,Ubuntu 是一种基于 Linux 的操作系统,通常用于运行基于 Linux 的应用程序。要在 Linux 上安装 C 并在 Ubuntu 上构建和运行 C 程序文件,我们需要安装 GCC 编译器。在 Ubuntu 存储库中,GCC 编译器是我们需要安装的 构建基本 包的一部分。 我们知道

    2024年04月13日
    浏览(48)
  • 【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库

    本文思维导图: 🍉博主主页:@在肯德基吃麻辣烫 我们知道,sudo指令后面紧跟的一条指令,该条指令是以root身份执行的对于有一些我们普通用户无法执行的指令,就需要用到该指令进行提权。 sudo + 指令 功能:以管理员身份执行该条指令 比如: sudo touch mycode.c 然而我们执行

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包