14.1.3 GCC的常用选项
GCC命令的一般格式为:GCC [选项] 要编译的文件 [选项] [目标文件]
其中,目标文件可缺省,GCC默认生成可执行的文件。GCC编译器能将C语言、C++语言源程序、汇编语言程序和目标程序编译、链接成可执行文件,如果没有给出可执行目标文件的名字,GCC将生成一个名为a.out的文件。
最简单的编译方法就是只给出要编译的C语言源程序文件名就够了。例如:执行gcc example.c,系统将example.c编译为可执行文件a.out,在终端提示符下执行./a.out,即可得到执行结果。在使用GCC编译器的时候,有时需要我们给出一系列必要的调用参数和文件名称。GCC编译器有超过100个的可用选项,主要包括总体选项、告警和出错选项、优化选项和体系结构相关选项。以下对每一类中最常用的选项进行讲解。
(1)总体选项
-c选项告诉GCC只编译,不链接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-S选项告诉GCC在为C代码产生了汇编语言文件后停止编译。GCC产生的汇编语言文件的缺省扩展名是.s。
-E选项指示编译器仅对输入文件进行预处理。当这个选项被使用时,预处理器的输出被送到标准输出而不是储存在文件里。-g选项产生符号调试工具(GNU的gdb)所必要的符号资信,要想对源代码进行调试,就必须加入这个选项。-o file选项确定输出文件的名称为file,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出缺省的可执行文件a.out。
-I dir选项可以在头文件的搜索路径列表中添加dir目录。由于Linux中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,GCC就会到相应的位置查找对应的目录。将dir所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C语言程序中的头文件包含两种情况:一类使用尖括号(〈 〉),预处理程序在系统缺省的包含文件目录(如/usr/include)中搜寻相应的文件;一类使用双引号(“ ”),预处理程序在当前目录中搜寻头文件,这个选项的作用是告诉预处理程序,如果在当前目录中没有找到需要的文件,就到指定的dir目录中去寻找。在程序设计中,如果需要这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。
-L dir选项的功能与“-I dir”类似,能够在库文件的搜索路径列表中添加dir目录。
需要注意的是,“-I dir”和“-L dir”都只是指定了路径,而没有指定文件,因此不能在路径中包含文件名。
-l library选项指示GCC去连接库文件library.so。由于在Linux下的库文件命名时有一个规定:必须以lib三个字母开头。因此,在用-l选项指定链接的库文件名时可以省去lib三个字母,也就是说GCC在对“-l rary”进行处理时,会自动去链接名为library.so的文件。总体选项的含义总结参见表14-2。
表14.2 总体选项及含义
(2)告警和出错选项
告警和出错选项的含义总结参见表14-3。
表14.3 告警和出错选项及含义
(3)优化选项
GCC可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的GCC来讲,n的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0变化到2或3。
不同的优化级别对应不同的优化处理工作。如使用优化选项“-O”主要进行线程跳转(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。使用优化选项“-O2”除了完成所有“-O1”级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项“-O3”则还包括循环展开和其他一些与处理器特性相关的优化工作。
虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也有可能因为循环展开而变得到处都有,所有这些对调试来讲都十分不利。所以我们建议在调试的时候最好不使用任何优化选项,只有当程序在最终发行的时候才考虑对其进行优化。
(4)体系结构相关选项
这些体系结构相关选项在嵌入式的设计中会有较多的应用,在PC机中使用较少,感兴趣的读者可查看有关书籍,我们在此不作介绍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。