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");
return0;
}
#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./hellolHello
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.ogcc -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 目标代码生成可执行文件