linux GCC程序编译

来源:互联网 发布:大数据优点 编辑:程序博客网 时间:2024/05/22 13:25

一:概述

linux系统下的gcc(GNU C Compile)是GNU的代表作编译器之一,gcc可以在多个硬件平台上编译出可执行程序,其执行效率与一般的编译器相比平均效率要高20%~30.GCC编译器能将C、C++语言源程序、汇编程序编译、连接成可执行文件。

注意:在linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。

 

二:编译的四个阶段

预处理(Pre-processing)

编译    (Compiling)

汇编    (Assembling)

链接    (Linking)

 

GCC是通过文件的后缀名来区别输入文件的类别 

下面各种类别文件的后缀名:

* .c为后缀的文件:是C语言源代码文件

* .C .cc .cxx为后缀名的文件:是C++源代码文件

* .s为后缀的文件:是汇编源代码文件

* .i为后缀的文件:是已经预处理过的C源代码文件

* .ii为后缀的文件:是已经预处理过的C++源代码文件

* .S为后缀的文件:是经过预编译的汇编语言源代码文件

* .h为后缀的文件:是头文件

* .o为后缀的文件:是编译后的目标文件

* .a为后缀的文件:是有目标文件构成的库文件

 

三:编译选项

GCC编译器的编译选项大概有100个,但是大部分使用不到,真正使用是只有10来个,如:

1:-o

作用:指定编译好的可执行文件的文件名

范例:gcc kaka.c -o kaka

结果:生成kaka         

注意:如果缺省-o,那么默认的名字为a.out

范例:gcc kaka.c

结果:生成a.out

 

2:-c

作用:只进行预处理

和编译,不链接生成可执行文件,编译器只是将输入的源文件生成为后缀为.o的目标文件

范例:gcc -c kaka.c

结果:生成kaka.o

 

3:-g

作用:产生调试工具(GNU的gdb)所需要的符号信息。也就是说如果你想要对编译出的程序

            进行调试,就必须要加上这个选项。

 范例:gcc -g kaka.c -o kaka

 结果:加上-g的明显的特征的编译生成的后的课执行文件变大了

 

4:-O、-O2(注意是大o)

作用:-O对程序进行优化编译、链接,采用这个编译选项,整个源代码会再编译、链接过程中进行

            优化处理,这样产生的可执行文件的执行效率可以提高,但是相应的编译、链接时间相应

            的增长。

           -O2比-O更好的优化编译、链接,当然整个编译、链接过程会更慢

范例:gcc -O kaka.c -o kaka

            gcc -O2 kaka.c -o kaka1

然后用time加执行文件计算执行的时间

            time ./kaka

            time ./kaka1

结果:加有-O生成的文件执行的时间比不加短

            加有-O2生成的文件执行时间比加有-O更短

 

5:-Idirname(注意是大写i)

作用:将dirname所指出的目录加入到程序头文件目录列表中。

            C程序中的头文件包括两种情况:

             <>一种是编译器自带的头文件

             ""一种的用户自己编写的头文件

            对于<>,编译器在系统预设的头文件目录(如/usr/include)中搜索相应头文件,

            对于“”编译器在当前目录查找所需头文件,没有后在到系统预设目录中查找。

            而一般情况之下,编译器在编译、链接时候只从编译器自带的头文件目录查找,

            所以如果想让编译器查找自己的头文件,那么就必须将自己编写的头文件所在

            目录加入到编译器查找的头文件目录中。

 范例:gcc  I/home/kaka/include kaka.c -o kaka

 

6:-Ldirname

作用:将dirname所指出的目录加入到编译器查找的库文件目录列表中

            默认情况下,链接程序时,系统会到预设目录(如/usr/lib)寻找所需的库文件

           但是加入了—Ldirname这个编译选项,那么编译器在连接时,会先到dirname

           指定的目录中查找,然后再到系统预设路径中查找。

范例:gcc -L/home/kaka/lib kaka.c -o kaka

 

7:-lname

作用:链接一些除C库之外的一些库文件,因此使用时应该特别指出

            “libname.a”的函数库,该函数库位于系统预设的目录下,或者在-L选项指定的

            目录下。

范例:gcc -L/home/kaka/lib -llibm.a kaka.c -o kaka

 

8: -static 

作用:静态链接库文件

           库的链接方式有两种:

           动态链接

           静态链接

           通常用.so作为动态链接的后缀,用.a作为静态链接的后缀。

           当使用静态链接库时,连接器会找出所程序所需要的文件,然后和可执行文件链接到

           一起,一旦链接成功,静态程序库也就不需要了。

           当使用动态链接库时,动态库会再执行程序的内留下一个标记,一定程序执行遇到这个

           标记时,首先必须载入这个库,然后加载所需的函数。

注意:linux下进行链接的时候,缺省状态下用的是动态链接库。

范例:gcc -static kaka.c  -o kaka

结果:用静态链接库的比用动态链接库生成的文件要大很多倍

 

9:-Dkaka

作用:定义宏,相当于在程序中使用#define kaka

 

10:-Wall

作用:生成所用警告信息

 

11:-w

作用:不生成任何警告信息

原创粉丝点击