C语言gcc处理过程

gcc编译C文件一共四步,预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking)

 1. 预处理(Preprocess)

            预处理是预处理中会展开以#起始的行,包括#if、#ifdef、#if ndef、 #else 、 #elif 、 # endif、#define、#include、#line、 #error、#pragma以及单独的#。其实就是把除了函数(包括main)以外的东西都展开成指定的形式,比如加上行号等,并将头文件里包含的东西所对应的文件(包括子文件夹)也都写入进去以便调用。同时也会把写在文件里的注释都删掉。

gcc -E text.c -o text.i

    -E是仅激活预处理程序,将生成的信息放入text.i。如果不写 -o text.i 就会生成到终端显示。相当于重定向。 

2. 编译(compilation)

        编译的作用就是把预处理完的文件进行一系列语法分析及优化后生成相应的汇编文件。

gcc -S text.c -o text.s

 3. 汇编(Assembly)

        汇编就是把生成的汇编指令逐条翻译成机器可以识别的形式,即机器码(二进制文件),这一步会产生平台相关性,即决定了在哪种平台下运行。

gcc -c text.s -o text.o

.o文件是目标文件类型,如果执行会提示权限不够,使用 chmod o+x text.o 赋予权限,但会提示不可执行的二进制文件于是需要链接。

4. 链接(Linking)

        这是最后一步,将生成的目标文件和其所依赖的库文件进行连接,生成一个可执行文件。链接的细节方面可以参考CSAPP的第七章,很详细,包括可执行目标文件和重定位目标文件的区别等。

gcc text.o -o text.out

5.运行程序

  输入    ./text.out  执行c程序

一步gcc编译C文件:

gcc text.c -o text -I ./ 
./text

或者这样 

gcc text.c -o text.o
./text.o

  

 如上 -o选项就是链接,后面加上生成的可执行文件的名字,不输入默认为 a.out 。所有步骤都隐式被悄悄搞定了,生成的文件用完都删掉了。-I 选项后面加上text.h 的路径,即告诉编译器在这个目录下找头文件,因为在 text.c 中用到了 text.h 。如果它们在同一个目录下是可以省略的。

原文地址:https://www.cnblogs.com/huxiaobai/p/10251084.html