Linux下C语言程序的编译过程

使用gcc编译程序时,编译工程分为4个阶段:

(1)预处理:(Pre-Processing)

(2)编译:(Compiling)

(3)汇编:(Assembling)

(4)链接:(linking)

 

预处理、编译、汇编是3个不同的阶段,但gcc在实际操作时可以把3个步骤合并为一个步骤来执行。下面以一个实例介绍如何生成各个阶段的代码。下面演示都针对文件 hello.c 进行。

1、编译单个文件

首先 vim hello.c 在hello.c中 按下 i 或者 insert 输入以下内容

#include   

#include   

int main()  

{  

   printf("Hello world!\n");

return 0; 

}  

 

#include

#include

 

int main(int argc, char **argv)

{

        printf("Hello world!\n");

}

输入完成后按 esc 输入:wq保存并退出

再输入以下命令:

gcc -o hello hello.c

./hello

执行的结果为:

Hello world!

 

2、编译多个文件

分别vim   hello.c hellolinux.c两个文件,在两个文件中分别存入以下内容:

 

#include   

#include   

int main()  

{  

printf("Hello world!\n");  

hello_linux();  

exit(0);  

}  

 

#include

#include

 

int main(int argc, char **argv)

{

        printf("Hello world!\n");

        hello_linux();

        exit(0);

}

 

#include   

void hello_linux(void)  

{  

printf("hello linux!\n");  

}  

 

#include

 

void hello_linux(void)

{

        printf("hello linux!\n");

}

 

执行:

gcc -c hellolinux.c  

gcc -c hello.c

gcc -o liunxworld  hellolinux.o hello.o

./liunxworld

输出的结果为:

Hello world!

hello linux!

 

或者将两个.c文件一起编译为

gcc -o hellol hello.c hellolinux.c 

./hellol 

Hello world!

hello linux!

 

第一阶段

在预处理阶段,输入的是C语言源文件,通常为*.c或者*.C,它们一般带有*h之类的头文件。这个阶段主要处理源文件中的#ifdef、#include和#define预处理命令。该阶段会生成一个中间文件*.i

1.生成预处理后的文件hello.i

  gcc -E hello.c -o hello.i

它通过对源文件hello.c使用E选项来生成中间文件hello.i

第二阶段

在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s,这个阶段对应的gcc命令如下所示:

2.生成汇编语言文件hello.s

    gcc-s hello.i -o hello.s

第三阶段

在汇编阶段,将输入的汇编文件*.s转换成二进制机器代码*.o,这个阶段对应的gcc命令如下所示:

  gcc -c hello.s-o hello.o

第四阶段

在链接阶段,将输入的二进制机器代码文件*.o(与其他机器代码文件和库文件)汇集成一个可执行的二进制代码文件。

4. 生成可执行文件

 gcc hello.o -o hello 

如果有多个源文件,可以这样来编译:

    gcc -c test1.c -o test1.o

    gcc -c test2.c -o test2.o

      gcc test1.o test2.o -o test

注意:如果不指定文件名,gcc会生成名为a.out的文件,.out文件只是为了区分编译后的文件,Linux下并没有标准的可执行文件后缀名,一般可执行文件都没有后缀名。

编译后生成的test文件就是程序了,运行它:

    ./test

 

以下是C程序一般的编译过程:

将编写的一个c程序(源代码 )转换成可以在硬件上运行的程序(可执行代码 ),需要进行编译阶段和链接这两个阶段。

1.  编译阶段先通过“编译器”把一个 .c/ .cpp 源代码 编译成 .s的汇编代码 ;再经过“汇编器”把这个.s的汇编代码汇编成 .o 的目标代码

2. “连接器” 通过连接其他 .o 代码和1中的.o 目标代码生成可执行文件。

你可能感兴趣的:(Linux学习)