gcc/g++中的生成可执行文件步骤

步骤

生成可以执行文件需要四个步骤:
预处理——编译——汇编——链接

在编译过程中,除非使用了-E、-S、-C选项(或者编译出错阻止了完整的编译过程)否则最后的步骤都是链接生成到最后的可执行文件。
比如:
gcc hello.c
他会输出一个默认的可执行程序 a.out,然后我们直接调用 ./a.out 来执行该应用程序。

下面我们逐步来看一下每一步都在做什么以及生成什么文件。

例子

我们用一个简单的例子来说明

#include<stdio.h>

#define   MAX  20 
#define   MIN  10 

int main()
{
	printf("this is a compile sample\n");
	printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN); 

	return 0;
}

这里我们可以一步生成可执行文件
gcc test.c
会生成默认可执行文件a.out

预处理 -E

作用:处理宏定义和include,去除注释,不会对语法进行检查,生成.i文件

命令:
gcc -E test.c -o test.i
我们预处理后生成test.i文件
我们打开test.i文件发现有很多东西,最下面出现的是
在这里插入图片描述
我们看到他将宏直接展开成数字,而宏定义已经没了

编译 -S

作用:检查语法,生成汇编指令, .s文件。

命令:
gcc -s test.c -o test.s
在这里插入图片描述
可以看到生成的是汇编代码

汇编 -C

作用: 翻译成符合一定格式的机器代码, 生成.o文件。
命令
gcc -c test.c -o test.o

.o:object file(OBJ文件) 这里表现为二进制目标文件:
在这里插入图片描述

mac下生成的是mac目标文件
在这里插入图片描述
Linux下生成的是ELF目标文件
在这里插入图片描述

链接 -O

作用:链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

gcc -o test test.c
在这里插入图片描述
这里我们生成的test就是一个可执行程序。-o是指定生成的可执行文件名称。他把前面几步都默认执行了。

在编译过程中,除非使用了-E、-S、-C选项(或者编译出错阻止了完整的编译过程)否则最后的步骤都是链接生成到最后的可执行文件。
所以一般我们都是直接执行-o选项生成可执行文件

总结

一般我们其实不用关注前面三步,预处理——编译——汇编。因为这三步我们不需要去干预什么,都是机器自动检查错误或者生成一些东西。而最后一步链接的是链接一些库,这个就有我们可以操作的东西了,比如说我们指定一些可以连接的动态库,包括我们自己制作一些库放到给别人链接。这个我会在下一篇文章详细讲一下。

GCC(GNU Compiler Collection)是GNU编译器套装,可以用来编译C、C++、Objective-C、Fortran、Ada等语言的源代码,生成可执行文件GCC命令的基本格式如下: ``` gcc [选项] 文件名 ``` 其,选项部分可以指定编译的级别、生成文件类型等,文件名则是源代码文件。例如,如果你有一个名为`hello.c`的C语言源文件,你可以使用以下命令来生成可执行文件: ``` gcc hello.c -o hello ``` 这条命令会调用GCC编译`hello.c`文件,并将生成可执行文件命名为`hello`。 GCC编译过程通常包括预处理、编译汇编和链接四个步骤: 1. 预处理(Preprocessing):处理源文件的预处理指令,如宏定义和文件包含。 2. 编译(Compilation):将源代码转换成汇编代码。 3. 汇编(Assembly):将汇编代码转换成机器代码,生成目标文件(通常是`.o`或`.obj`文件)。 4. 链接(Linking):将一个或多个目标文件和库文件合并,生成最终的可执行文件。 常见的GCC选项包括: - `-c`:只编译不链接,生成目标文件。 - `-g`:生成调试信息,方便使用调试器。 - `-O`或`-O2`或`-O3`:优化代码,`-O3`为最高优化级别。 - `-I<dir>`:添加头文件搜索路径。 - `-L<dir>`:添加库文件搜索路径。 - `-l<lib>`:链接指定的库文件。 - `-o <file>`:指定输出文件的名称。 编译C++代码时,通常使用`g++`命令,它是GCC的C++编译器前端,命令用法与GCC相似。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charles Ray

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值