GCC编译器基本使用方法

版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/91150595

GCC仅仅是一个编译器,不是IDE,没有界面,只能在命令行下使用。GCC是可以直接完成源文件的编译。经常使用的命令就是直接生成一个可执行文件。

gcc 源文件 -o 可执行文件

这样的方式,可以把源文件直接编译为可执行文件,并且为可执行文件指定名称。更加简单的编译命令如下

gcc 源文件

这样生成的可执行文件,默认名字是a.out。例如:

可以看到,默认生成的可执行文件名字就是a.out。这个.out后缀对于Linux是没有意义的,Linux的文件类型就是那么几类。它不依文件后缀来区分文件类型。下面按照指定可执行文件的名称来编译一次。

GCC是可以分步编译源文件的。其过程正如学习C语言的时候讲述的一致,如下图所示。

打开helloworld.i文件可以看到,头文件会被包含进来。形成一个很大的文件。接下来,将预处理过的文件进行编译。

  1. 预处理使用选项“-E”。预处理阶段展开宏,文件包含,条件编译。在正常情形下,GCC不会保留预处理阶段的文件,但是使用-E选项可以保留。例如
  1. 编译是对上面的.i文件进行的,编译完成以后生成汇编文件。 gcc -S helloworld.i -o helloworld.s 打开 helloworld.s文件,可以看到汇编语言。
  2. 汇编,将上面生成的汇编语言编译为目标机器的二进制文件。只汇编,不链接。  gcc -c helloworld.s -o helloworld.o
  3. 链接,链接器把多个二进制的目标文件(.o文件)链接成一个单独的可执行文件。在链接过程中,它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序中多个模块的外部引用。最终生成可执行文件。 gcc helloworld.o -o helloworld 上面的代码很简单,不需要链接什么,直接生成可执行文件。

当头文件和源文件非常多的时候,使用GCC基本命令编译是非常麻烦的。每次调试都需要重新编译。这时候你可能会想到使用IDE吧!不使用GCC了。不能一键编译,好蠢,好麻烦。幸运的是,虽然GCC没有自动项目管理工具,但是它提供了Makefile文件来帮助我们提高写程序的效率。

GCC可以使用-O0,-O1,-O2,-O3可以优化程序。O0表示不优化,O3表示优化等级最高。

GCC使用-Wall来打印警告信息,这样有助于调试程序。

GCC使用-w来忽略所有的警告。

GCC使用-g包含调试信息,这在使用gdb调试的时候是必要的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏go语言核心编程技术

go语言调度器源代码情景分析之二:CPU寄存器

寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU...

12140
来自专栏go语言核心编程技术

go语言调度器源代码情景分析之五:汇编指令

汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣...

15120
来自专栏go语言核心编程技术

深入理解defer(上)defer基础

f() 函数首先通过调用 getResource() 获取了某种资源(比如打开文件,加锁等),然后进行了一些我们不太关心的操作,但这些操作可能会导致 f() ...

8920
来自专栏JackieZheng

Go语言学习——彻底弄懂return和defer的微妙关系

  最近在写代码的时候经常遇到在return后,还要在defer里面做一些收尾工作,比如事务的提交或回滚。所以想弄清楚这个return和defer到底是什么关系...

12620
来自专栏dylanliu

asm 笔记

#####overall structure of a compiled class

10330
来自专栏音视频技术

Dav1d移动端解码高清视频达30FPS

LiveVideoStack正在招募编辑/记者/运营,与全球顶尖多媒及技术专家和LiveVideoStack年轻的伙伴一起,推动多媒体技术生态发展。了解岗位信息...

7120
来自专栏go语言核心编程技术

go语言调度器源代码情景分析之三:内存

内存由大量内存单元组成,内存单元大小为1个字节(1字节包含8个二进制位), 每个内存单元都有一个编号,更专业的说法是每一个内存单元都有一个地址,我们在编写汇编代...

10230
来自专栏IT大咖说

雷军的贵人,剑网3,WPS,武当弟子:求伯君传奇

1991年11月4日,在一个计算机展览会上,求伯君和雷军第一次相遇,求伯君邀请雷军加入公司,雷军从武汉大学毕业创立公司刚失败,正好有这个机会就加入了,雷军回忆说...

19720
来自专栏go语言核心编程技术

go语言调度器源代码情景分析之六:go汇编语言

go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也...

14130
来自专栏嵌入式大杂烩

【C语言笔记】C语言编译的过程

如果你使用的是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?

15130

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励