使用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 目标代码生成可执行文件。