博舍

Linux下gcc编译c程序生成可执行文件的过程 用gcc编译生成可执行文件yanghui

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选项生成可执行文件。

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇