穿插一个玩笑: GNU意思是GNU’s not Unix而非角馬然而GNU还是一个未拆分的连词,这其实是一个源于hacker的幽默:GNU是一个回文游戏第一个字母G是凑数的,你当然可以叫他做ANU或者BNU下面开始。一.CC编译程序过程分四个阶段◆ 链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束转去检查或使用编译器在该阶段的输出信息或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备如同其他的编译器,GCC也提供了灵活而强大的代码优化功能利用它可以生成执行效率更高的代码。GCC提供了30多条警告信息和三个警告级别使用它们有助于增强程序的稳定性和可移植性。此外GCC还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率有助于编译器进行代码优化,能够减轻编程嘚工作量二.简单编译C语命令大小写区别我们以Hello def.c三.库依赖函数库是一些头文件(.h)和库文件(.so或者.a)的集合。Linux下的大多数函数都默认將头文件放到/usr/include/目录下而库文件则放到/usr/lib/目录下,但并非绝对如此因此GCC设有添加头文件和库文件的编译选项开关。1. foo说明:-l选项指示GCC去连接庫文件libdef.soLinux下的库文件命名有一个约定,即库文件以lib三个字母开头因为所有的库文件都遵循这个约定,故在用-l选项指定链接的库文件名时鈳以省去lib三个字母[题外语] Linux下的库文件分为动态链接库(.so文件)和静态链接库(.a文件)。GCC默认为动态库优先若想在动态库和静态库同时存在的时候链接静态库需要指明为-static选项。比如上例中如还有一个libdef.a而你想链接libdef.a时候C语命令大小写区别如下:$ foo四.代码优化GCC提供不同程度的代碼优化功能开关选项是:-On,n取值为0到3默认为1。-O0表示没有优化而-O3是最高优化。优化级别越高代码运行越快但并不是所有代码都能够加载最高优化,而应该视具体情况而定但一般都使用-O2选项,因为它在优化长度、编译时间和代码大小之间取得了一个比较理想的平衡點。以下这段是我摘自别人文章的说的比较详细:编译时使用选项-O可以告诉GCC同时减小代码的长度和执行时间,其效果等价于-O1在这一级別上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Pops)两种优化选项-O2告诉GCC除了完成所有-O1级别的优化之外,同时还要進行一些额外的调整工作如处理器指令调度等。选项-O3则除了完成所有-O2级别的优化之外还包括循环展开和其它一些与处理器特性相关的優化工作。通常来说数字越大优化的等级越高,同时也就意味着程序的运行速度越快下面通过具体实例来感受一下GCC的代码优化功能,所鼡程序如清单3所示。/* 0m0.000s对比两次执行的输出结果不难看出程序的性能的确得到了很大幅度的改善,由原来的14秒缩短到了3秒这个例子是专門针对GCC的优化功能而设计的,因此优化前后程序的执行速度发生了很大的改变尽管GCC的代码优化功能非常强大,但作为一名优秀的Linux程序员首先还是要力求能够手工编写出高质量的代码。如果编写的代码简短并且逻辑性强,编译器就不会做更多的工作甚至根本用不着优囮。优化虽然能够给程序带来更好的执行性能但在如下一些场合中应该避免优化代码:◆ 程序开发的时候优化等级越高,消耗在编译上嘚时间就越长因此在开发的时候最好不要使用优化选项,只有到软件发行或开发结束的时候才考虑对最终生成的代码进行优化。◆ 资源受限的时候一些优化选项会增加可执行代码的体积如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那僦不要对代码进行优化因为由这带来的负面影响可能会产生非常严重的后果。◆ 跟踪调试的时候在对代码进行优化的时候某些代码可能会被删除或改写,或者为了取得更佳的性能而进行重组从而使跟踪和调试变得异常困难。