linux下最常见的C语言编译器是gcc(GNU Complier Collection)。
gcc不仅能够编译C/C++;它还可以编译java;Fortran;Pascal;Ada等语言编写的程序。
gcc的编译过程分为4个阶段:.c源文件——.i中间文件——.s汇编文件——.o二进制代码文件——可执行文件
1.预处理(Pre-Processing).c---.i
主要处理源文件中的#ifdef;#include;#define预处理命令
2.编译(Compiling).i---.s
3.汇编(Assembling).s----.o
4.链接(Linking).o---可执行文件
将二进制代码文件与其他的机器代码文件和库文件汇集成一个可执行的二进制代码文件。
一个程序无论有多少个源文件,在所有被编译和链接的源文件中必须有且只有一个main函数,因为main函数是每个程序的入口点。
但如果仅仅是把源文件编译成目标文件,因为不进行最后的链接,所以这是main函数不是必需的。
gcc编译器的选项有100多,最常用的:
-c 只编译,不链接成可执行的文件,由.c生成.o目标文件。通常用于编译不包含主程序的子程序文件。
-o output_filename 确定输出文件名称为output_filename,同时不能和源文件同名。
-g 产生调试器gdb所必需的符号信息,要对源代码调试,就必需有该选项。
-O 对程序进行优化编译,链接。有优化处理,这样执行效率更高。
-O2 比-O更好的优化编译链接,但整个过程更慢。
-Wall 输出所有警告信息。
-w 关闭所有警告。
-Idirname将名为dirname的目录加入到程序头文件目录中,这是在预处理阶段使用的选项。I意指include.
C程序中包含头文件有2种方法:
1.#include<*.h>.gcc会在系统预设包含文件目录下查找相应头文件,适用于系统提供的头文件。
2.#include"*.h"。gcc首先在当前目录下查找,然后到指定dirname下查找。
实际开发中,对于自己写的头文件,通常放在与源文件相同的目录中,但在编写大型程序时,往往把头文件单独放在一个目录中。
-Ldirname将名为dirname的目录加入库文件搜索目录中,这是在链接过程中使用的选项。
-lname 链接时装载名为libname.a的函数库,该库位于系统预定义的目录中或者由-L制定的目录中。
gcc不仅能够编译C/C++;它还可以编译java;Fortran;Pascal;Ada等语言编写的程序。
gcc的编译过程分为4个阶段:.c源文件——.i中间文件——.s汇编文件——.o二进制代码文件——可执行文件
1.预处理(Pre-Processing).c---.i
主要处理源文件中的#ifdef;#include;#define预处理命令
2.编译(Compiling).i---.s
3.汇编(Assembling).s----.o
4.链接(Linking).o---可执行文件
将二进制代码文件与其他的机器代码文件和库文件汇集成一个可执行的二进制代码文件。
一个程序无论有多少个源文件,在所有被编译和链接的源文件中必须有且只有一个main函数,因为main函数是每个程序的入口点。
但如果仅仅是把源文件编译成目标文件,因为不进行最后的链接,所以这是main函数不是必需的。
gcc编译器的选项有100多,最常用的:
-c 只编译,不链接成可执行的文件,由.c生成.o目标文件。通常用于编译不包含主程序的子程序文件。
-o output_filename 确定输出文件名称为output_filename,同时不能和源文件同名。
-g 产生调试器gdb所必需的符号信息,要对源代码调试,就必需有该选项。
-O 对程序进行优化编译,链接。有优化处理,这样执行效率更高。
-O2 比-O更好的优化编译链接,但整个过程更慢。
-Wall 输出所有警告信息。
-w 关闭所有警告。
-Idirname将名为dirname的目录加入到程序头文件目录中,这是在预处理阶段使用的选项。I意指include.
C程序中包含头文件有2种方法:
1.#include<*.h>.gcc会在系统预设包含文件目录下查找相应头文件,适用于系统提供的头文件。
2.#include"*.h"。gcc首先在当前目录下查找,然后到指定dirname下查找。
实际开发中,对于自己写的头文件,通常放在与源文件相同的目录中,但在编写大型程序时,往往把头文件单独放在一个目录中。
-Ldirname将名为dirname的目录加入库文件搜索目录中,这是在链接过程中使用的选项。
-lname 链接时装载名为libname.a的函数库,该库位于系统预定义的目录中或者由-L制定的目录中。