c编译的一点小知识

来源:互联网 发布:js书籍推荐 编辑:程序博客网 时间:2024/05/01 22:55

 

使用gcc汇编器编译C语言程序时通常会经过4个处理阶段,即预处理阶段、编译阶段、汇编阶段和链接阶段。

在预处理阶段中,gcc会把C程序传递给C前处理器cpp,对C语言程序中指示符和宏进行替换处理,输出纯C语言代码;在编译阶段,gcc把C语言程序编译生成对应的与机器相关的as汇编语言代码;在汇编阶段,as汇编器会把汇编代码转换成机器指令,并以特定二进制格式输出保存在目标文件中;最后GNU ld链接器把程序的相关目标文件组合链接在一起,生成程序的可执行映像文件。调用gcc的命令行格式与编译汇编语言的格式类似:

gcc [ 选项 ] [ -o outfile ] infile ...

 

对于某次编译过程,并非一定要全部执行这4个阶段,使用命令行选项可以令gcc编译过程在某个处理阶段后就停止执行。例如,使用"-S"选项可以让gcc在输出了C程序对应的汇编语言程序之后就停止运行;使用"-c"选项可以让gcc只生成目标文件而不执行链接处理,如下所示。

 

gcc -o hello hello.c   // 编译hello.c程序,生成执行文件hello。
gcc -S -o hello.s hello.c  // 编译hello.c程序,生成对应汇编程序hello.s。
gcc -c -o hello.o hello.c // 编译hello.c程序,生成对应目标文件hello.o而不链接

 

 

-g 在编译时产生调试信息,供gdb使用。如

gcc -g -o hello hello.c

 

所以如果要用gdb进行调试,则必须在编译的时候用-g。

 

-Idir 在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如 果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找. 对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺 省的头文件目录查找 .   

 

-llibrary 制定连接的时候使用的库   例子用法  gcc -lcurses hello.c   使用ncurses库连接程序  

 
-Ldir   制定连接的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然 连接器将只在标准库的目录找。这个dir就是目录的名称。

-M  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c 来测试一下,很简单。  

原创粉丝点击