Linux下gcc编译c程序生成可执行文件的过程
Linux下gcc编译c程序生成可执行文件
一、准备hello.c文件1、在当前目录下新建c文件$:vimhello.c
2、按i进入编辑模式。按esc退出编辑模式,输入源代码#includeintmain(void){printf("helloworld");return0;}退出编辑模式,按住shift+两次z退出(命令行模式下,或者在底行模式下wq)
二、四个步骤Linux下gcc编译c文件为可执行文件分为四个步骤:分别是预编译、编译、汇编、链接
1、预编译(生成hello.i文件)预编译器cpp把源代码文件和相关
gcc/g++中的生成可执行文件步骤
文章目录步骤例子预处理-E编译-S汇编-C链接-O总结步骤生成可以执行文件需要四个步骤:预处理——编译——汇编——链接
在编译过程中,除非使用了-E、-S、-C选项(或者编译出错阻止了完整的编译过程)否则最后的步骤都是链接生成到最后的可执行文件。比如:gcchello.c他会输出一个默认的可执行程序a.out,然后我们直接调用./a.out来执行该应用程序。
下面我们逐步来看一下每一步都在做什么以及生成什么文件。
例子我们用一个简单的例子来说明
#include#defineMAX20#defineMIN10intmain(){printf("thisisacompilesample ");printf("MAX=%d,MIN=%d,MAX+MIN=%d ",MAX,MIN,MAX+MIN);return0;}这里我们可以一步生成可执行文件gcctest.c会生成默认可执行文件a.out
预处理-E作用:处理宏定义和include,去除注释,不会对语法进行检查,生成.i文件
命令:gcc-Etest.c-otest.i我们预处理后生成test.i文件我们打开test.i文件发现有很多东西,最下面出现的是我们看到他将宏直接展开成数字,而宏定义已经没了。
编译-S作用:检查语法,生成汇编指令,.s文件。
命令:gcc-stest.c-otest.s可以看到生成的是汇编代码
汇编-C作用:翻译成符合一定格式的机器代码,生成.o文件。命令gcc-ctest.c-otest.o
.o:objectfile(OBJ文件)这里表现为二进制目标文件:
mac下生成的是mac目标文件Linux下生成的是ELF目标文件
链接-O作用:链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。
gcc-otesttest.c这里我们生成的test就是一个可执行程序。-o是指定生成的可执行文件名称。他把前面几步都默认执行了。
在编译过程中,除非使用了-E、-S、-C选项(或者编译出错阻止了完整的编译过程)否则最后的步骤都是链接生成到最后的可执行文件。所以一般我们都是直接执行-o选项生成可执行文件。
总结一般我们其实不用关注前面三步,预处理——编译——汇编。因为这三步我们不需要去干预什么,都是机器自动检查错误或者生成一些东西。而最后一步链接的是链接一些库,这个就有我们可以操作的东西了,比如说我们指定一些可以连接的动态库,包括我们自己制作一些库放到给别人链接。这个我会在下一篇文章详细讲一下。