【Linux从入门到精通|开发工具】---gcc/g++的基本使用

这篇具有很好参考价值的文章主要介绍了【Linux从入门到精通|开发工具】---gcc/g++的基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【Linux专栏】🎈
本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

接下来我们来学习Linux编辑器---gcc/g++的使用。
在学习gcc/g++之前,我们先来简单回顾一下之前学过的编译链接的内容。

1.预处理(去注释、头文件展开、条件编译、宏替换)
2.编译(生成汇编代码)
3.汇编(生成机器可识别代码)
4.链接(生成可执行文件或库文件)

gcc使用过程(图文并茂)🍰

预处理阶段

首先这里这里源文件为mycode.c,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
然后输入指令gcc -E mycode.c -o mycode.i。编译通过之后就会形成mycode.i的一个文件。
这就是我们预处理之后的结果,如下图:

【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
我们通过上图可以发现源文件mycode.c经过预处理之后由原来的十几行代码变成了800多行代码。为什么会这样呢?这都是从系统当中C语言的头文件中拷贝出来的。

通过上图我们也可以观察到我们原来注释的内容直接被裁剪掉了(去注释),同时发生了宏替换(因为编译器不需要处理已经被我们注释掉的东西)。这里的宏替换要注意,该处的宏替换只是进行了简单的宏替换,并不会做语法检查,因为在编译之前,这里就已经发生宏替换,即已经被替换掉了,并没有机会进行语法检查。
头文件全部拷贝到源文件当中,即当预处理之后其实就不需要头文件了。

综上,源文件经过预处理(其中包含着宏替换、去注释、条件编译、头文件展开)之后代码就会变的比较干净,然后编译器继续对这份干净的代码进行处理,即来到了下一步编译阶段。

编译阶段(生成汇编)

输入指令:gcc -S mycode.c -o mycode.s,即生成了一个mycode.s的文件,请看:

【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
其中,mycode.s文件中就存放着mycode.c文件经过汇编之后生成的汇编代码,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

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

在汇编阶段,会把汇编代码转换为机器可识别的代码(即二进制文件)。
输入指令gcc -c mycode.s -o mycode.o
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
我们打开刚刚生成的mycode.o文件,里面存放的就是机器可识别代码(看起来像一堆乱码)。请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
这里说明一下,vim工具是一个文本编辑器(既然是文本编辑器的话那就只能识别文本啦),而mycode.o中存放的是二进制文件,我们用文本编辑器来打开一个二进制文件的话再显示出来,我们看到的就会是一堆乱码。那我们应该如何查看这个二进制文件mycode.o呢?我们可以使用二进制查看工具od,即输入指令od mycode.o。请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
到此为止,我们已经就来到了最后一个阶段,即链接阶段。

链接阶段(生成可执行文件或库文件)

输入指令gcc mycode.o -o mytest,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
这里的mytest就是一个可执行程序,我们来运行一个这个可执行程序。
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
好了,到此为止,就是一个源文件经过预处理、编译、汇编、链接再到最后运行程序的整个过程。
接下来,我们详细来介绍整个过程中用到的指令。

gcc/g++常用命令选项🎂

g++和gcc命令选项都是一个用法,所以这个只演示gcc的命令选项。

-o

将文件输出到目标文件。

注意,现在我们又回到了起点,即此时我们只有一个源文件mycode.c
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

gcc mycode.c
这里后面什么选项都不加,回车之后就会直接生成可执行程序a.out,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

gcc mycode -o XXX:让这个可执行程序自己来定义命名。其中-o意思就是后面跟我们想要自定义可执行程序的名称。
比如gcc mycode.c -o abc
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
其中,XXX就是着我们生成的可执行程序。运行结果如下:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
其实我们也可以换一种写法,即gcc -o mytest mycode.c。(只要遵循一个原则即可:-o后面必须是可执行程序的名称)。
请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

-E选项

gcc -E mycode.c -o mycode.i:对源文件进行预处理之后生成mycode.i文件。
这里有几个小细节需要我们注意-E后面永远跟着我们想要进行预处理操作的文件源,-o后面永远跟着最终要生成的目标文件。
如果我们这里的命令不加-o(即gcc -E mycode.c),这里会默认把输出结果打印到显示器上。这里我们就不进行演示了。
我们要把输出结果打印到文件里,其中-o后面生成的目标文件的文件名依然是可以随便取的,但是由于这里只对源文件mycode.c进行预处理操作,所以我们一般把生成的目标文件名取为mycode.i
下图是最终的演示结果:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
head mycode.i
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
现在来解释-E是什么意思:
-E的意思就是告诉gcc编译器,从现在开始进行程序的翻译工作,将预处理工作做完之后就停下来不在继续往后走了。

-S选项

gcc -S mycode.i -o mycode.s:对预处理之后的mycode.i文件进行编译,同时生成mycode.s文件。
-o后面依然是跟着生成的目标文件,文件名依然是随便取,这里是完成的编译工作,所以这里建议生成的目标文件的后缀为.s,即mycode.s。同时这里要注意gcc -S mycode.i -o mycode.s是直接从刚刚生成的.i文件开始,继续进行程序的翻译工作,将编译工作做完之后停止工作。
其实我们这里可以换一种写法gcc -S mycode.c -o mycode.s。即告诉gcc编译器,从源文件.c开始进行程序的翻译工作,将编译工作做完之后停下来不在进行程序的翻译工作
现在我们来打开一下mycode.s文件,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

-c

gcc -c mycode.s -o mycode.o,其中-c的意思就是从现在卡hi是进行程序的翻译工作,将汇编工作做完之后,工作停止。
换一种写法的话请看:gcc -c mycode.c -o mycode.o,这里是从.c源文件开始进行工作直到将汇编工作完成。而 gcc -c mycode.s -o mycode.o是直接从编译阶段之后生成的.s文件之后开始工作,直到将汇编工作做完之后,工作停止。
所以这里的-c就是告诉gcc编译器,将程序的汇编工作做完就停止工作。
同时这里要注意:我们把生成的.o文件,即mycode.o文件称之为可重定位目标二进制文件。简称目标文件。其实就是window环境下的可执行文件(-obj)。
我们打开mycode.o文件打开之后发现是一堆乱码。请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
我们这里要特别注意,生成的mycode.o文件是不可以独立执行的,虽然已经是二进制文件了,需要经过链接才可以执行。
我们来验证一下mycode.o确实是不能执行的,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
我们如果赋予mycode.o文件可执行权限(chmod +x mycode.o)的话,请看:
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维

可以看到依然是不可以执行的。
在Linux中,具有可执行权限和具有可执行的能力是两码事。
假设我给一个文本文件可执行的权限,最终这个文本文件依然是不可以执行的,因为这个文本文件本身就没有可执行的能力。
所以,这里的mycode.o文件(可重定位目标二进制文件)经过链接之后才可以运行。

最后进行链接:
gcc mycode.o -o mytest:将可重定位目标二进制文件和库进行链接形成可执行程序。
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维
j

总结🥖

本文主要带大家回顾了一下内容:
1.C语言中编译链接的部分知识,总共分为4个阶段(预处理、编译、汇编、链接)。
2.同时演示了gcc/g++的几个常用的命令选项(-E -S -c -o)。

好了,本文就到这里啦!再见啦友友们!!!
【Linux从入门到精通|开发工具】---gcc/g++的基本使用,Linux专栏,linux,运维文章来源地址https://www.toymoban.com/news/detail-524615.html

到了这里,关于【Linux从入门到精通|开发工具】---gcc/g++的基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Linux开发工具-vim-gcc-gdb指令及使用

    目录 linux软件包管理器yum(apt) linux开发工具 linux编辑器-vim使用 linux编译器-gcc/g++使用 linux调试器-gdb使用 linux项目自动化构建工具-make/makefile linux第一个小程序-进度条 使用github创建项目 使用git命令 我们前面学了关于linux的基本指令和基本权限的一些相关知识,那么我们今天

    2024年03月10日
    浏览(45)
  • 【嵌入式】Linux开发工具arm-linux-gcc安装及使用

    宿主机 执行编译、链接嵌入式软件的计算机 目标机 运行嵌入式软件的硬件平台 “本地”编译器 用来生成在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,例如 Windows 环境生成 Windows 目标代码。 交叉编译器 用来生成在其它平台上运行的目标代

    2024年01月17日
    浏览(45)
  • Linux基础环境开发工具的使用(yum,vim,gcc,g++)

    首先先说明一点: Centos系统适用于yum 而Ubanto适用于apt-get 在Linux中我们也要进行工具/程序/指令的安装,检查和卸载, 而我们安装软件的方式: 1.源代码安装-需要进行交叉编译的工作 一般那些很强的程序员中的大佬才能拿捏 2.rpm包直接安装,也很麻烦 3.yum直接安装 这就需要用到y

    2024年02月06日
    浏览(32)
  • VsCode开发工具的入门及基本使用

    大家好,我是[阿猫的故乡]。很高兴能有机会与大家分享关于VsCode开发工具的入门及基本使用的知识。 文章目录 文章目录 前言 一、VsCode是什么? 二、使用步骤 1.如何下载 2.如何使用 总结 在开发者社区中,Visual Studio Code(简称VS Code)已经成为最受欢迎的文本编辑器之一。作

    2024年02月02日
    浏览(56)
  • 【Linux】Linux环境基础开发工具的使用 ———(yum、vim、gcc&g++、gdb、make/Makefile、进度条 、git)

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 🎓 🌍博客主页:张小姐的猫~江湖背景🌍 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥集中起来的意志可以击穿顽石🔥 🙏作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉欢迎持续关注!🎉🎉

    2024年01月16日
    浏览(39)
  • 【Linux】基本开发工具包使用

    目录 一, yum ——linux软件包管理器  1. 软件包是啥子?  2.  yum基本使用  1. 步骤:  2. 开发工具推荐(centos 7.6) 二,vim —— linux文本编辑器 1. Normal mode  ——  命令模式(记不住没关系,多练就行) 2.  last line  mode——   末行模式 (如何进入;shift :) 3. Insert mode ——插

    2024年02月08日
    浏览(64)
  • Linux开发工具:gcc和g++

    目录 一. 什么是gcc和g++ 二. gcc的基本使用方法 三. 库和链接 3.1 动态库和静态库 3.2 动态链接和静态链接 四. Debug和Release 五. makefile和make 六. 总结  gcc:Linux下编译C语言程序的编译器 g++:Linux下编译C++代码的编译器 由于C++兼容C语言,因此g++既可以编译C++也可以编译C语言。

    2024年02月07日
    浏览(19)
  • 【Linux】基础开发工具——gcc/g++篇

    前言 :  在前面的文章里给大家介绍了 vim 的使用方法,学会了vim之后就可以进行代码的编写工作,但vim仅仅只是一款文本编辑器,要想让我们的代码运行起来,还需要使用今天给大家介绍的 编译工具:gcc/g++ 。其中gcc是针对C语言的编译器,g++是针对C++的编译器,他俩在使

    2024年02月15日
    浏览(29)
  • Linux 开发工具vim、gcc/g++、makefile

    目录 Linux编辑器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 简单vim配置 Linux编译器-gcc/g++ 1、基本概念  2、程序翻译的过程 3. gcc如何完成程序翻译 4、动静态库  Linux项目自动化构建工具-make/Makefile 1、背景 2、创建makefile 3、原理 5、项目清

    2024年03月11日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包