在Linux 下面,如果要编译一个C 语言源程序,我们要使用GNU 的gcc 编译器。下面
我们以一个实例来说明如何使用gcc 编译器。假设我们有下面一个非常简单的源程序
(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
要编译这个程序,我们只要在命令行下执行:
gcc -o hello hello.c
下面就详细说一下gcc的编译过程
gcc由C语言源代码文件生成可执行文件的过程,一般来说分为四个阶段:预处理(也称预编译Preprocessing)、编译(compilation)、汇编(Assembly)和链接(linking)。这四个阶段分别由gcc调用不同的程序来实现。
- 预处理是调用cpp程序来实现的,预处理主要是对包含语句、宏定义等进行处理。
- 编译是调用cc来实现的,它是源文件变为后缀为.o的目标文件的过程。
- 汇编过程是对汇编语言的操作,通过调用as来实现,汇编同样也生成目标文件。
- 链接是通过用ld来实现的。这是最为关键的步骤,在该阶段,ld会将各程序的执行代码放置在程序的适合位置,同时,程序调用的库函数也会以适当的方法设置调用接口。
gcc编译时,如果在命令行没有指定其他参数,则gcc会完成编译、链接的过程,然后在当前目录中生成一个名为a.out的可执行文件。一般来说,linux并不依赖文件的后缀来识别文件是否为可执行程序,其判断文件是否可执行依据的是文件的属性。如果对于当前用户而言,文件有运行权限,则该文件为一个可执行程序。
对于gcc而言,判断文件的类型主要是依据文件的后缀名。所以,要使用gcc编译代码,正确使用文件后缀是保证编译正确的前提。如果写了一个C++代码,却使用了.c为后缀,gcc在编译该文件时会将该文件按照C语言代码来处理,一般会出错。
一些gcc常用的文件后缀名:
- c: C语言源代码文件
- a:由目标文件构成的档案库文件
- .C、.cc 或.cxx:c++源代码文件
- h:头文件
- i:经过预处理的C源代码文件
- ii:经过预处理的C++源代码文件
- m:Objective-C源代码文件
- o:编译后的目标文件
- s:汇编语言源代码文件
- S:经过预编译的汇编语言源代码文件
gcc hello.c编译通过后,就可以简单的使用a.out调用该程序,使用命令如下:./a.out - 注意:这里不能直接使用a.out来调用该程序,因为shell在寻找可执行程序时,并不在当前目录中寻找,所以必须用“./”来显示指定该文件的路径是当前目录