.c 是c源程序 .i 是经过与处理的
.C;.cc;.cxx 是c++原始程序对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:
预处理 —》 编译——》汇编——》连接
功能上分,预处理、编译、汇编是三个不同的阶段,但GCC的实际操作上,它可以把这三个步骤合并为一个步骤来执行。下面我们以C语言为例来谈一下不同阶段的输入和输出情况。
在预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件不可,可以利用下面的示例命令:
gcc -E test.c -o test.i
在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:
gcc -S test.i -o test.s
在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:
gcc -c test -o test.o
最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:
gcc test.o -o test
上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。
GCC常用模式
这里介绍GCC追常用的两种模式:编译模式和编译连接模式。下面以一个例子来说明各种模式的使用方法。为简单起见,假设我们全部的源代码都在一个文件test.c中,要想把这个源文件直接编译成可执行程序,可以使用以下命令:
$ gcc test.c -o test
这里test.c是源文件,生成的可执行代码存放在一个名为test 的文件中(该文件是机器代码并且可执行)。-o 是生成可执行文件的输出选项。如果我们只想让源文件生成目标文件(此文件虽然也是机器代码但不可执行),可以使用标记-c ,详细命令如下所示:
$ gcc -c test.c
默认情况下,生成的目标文件被命名为test.o,但我们也可以为输出文件指定名称,如下所示:
$ gcc -c test.c -o mytes.o
上面这条命令将编译后的目标文件命名为mytest.o,而不是默认的test.o。
迄今为止,我们谈论的程序仅涉及到一个源文件;现实中,一个程序的源代码通常包含在多个源文件之中,这该怎么办?没关系,即使这样,用GCC处理起来也并不复杂,见下例:
$ gcc -o test first.c second.c third.c
该命令将同时编译三个源文件,即first.c、second.c和 third.c,然后将它们连接成一个可执行程序,名为test。
示例:
//先建三个目录 inc盛头文件 lib盛库文件 src盛源文件
生成main.o
接着进行连接
gcc main.o -L ../lib -ltools -o main//生成可执行文件 -L ../lib 指定库文件路径 -l 指定要连接的库文件
//////////////////////////////////////////
生成动态链接库
vi a.c
#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
gcc -fPIC -c a.c //将a.c文件编译成,-fPIC告诉编译器你要给我生成一个 可以重定位的目标文件
// 生成a.o目标文件
gcc -shared -o libabc.so a.o //将目标文件连接成 动态链接库
/////
编写程序调用自己建立的动态链接库
vi b.c
#include<stdio.h>
main()
{
printf(“1+2=%d“,add(1,2));
}
gcc -c -O b.c 编译生成目标文件b.o
export LD_LIBRARY_PATH = ./ //设置环境变量值为 ./
gcc b.o -L ./ -l abc -s -o b // -s 搜索.so结尾的文件
本文为作者多方”剽窃“结合自己所学组合所得,如有错误请回复指点,希望能对同道中人有所帮助。