2022年gcc选项及编译过程 .pdf
《2022年gcc选项及编译过程 .pdf》由会员分享,可在线阅读,更多相关《2022年gcc选项及编译过程 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、在为 Linux开发应用程序时, 绝大多数情况下使用的都是C 语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C 编译器。目前 Linux下最常用的 C 语言编译器是GCC (GNU Compiler Collection) ,它是 GNU 项目中符合ANSI C标准的编译系统,能够编译用C、C+和 Object C等语言编写的程序。GCC 不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如 Java 、 Fortran、 Pascal 、Modula-3和 Ada等。开放、自由和灵活是Linux的魅力所在,而这一点在GCC 上的
2、体现就是程序员通过它能够更好地控制整个编译过程。在使用GCC 编译程序时,编译过程可以被细分为四个阶段: 预处理( Pre-Processing) 编译( Compiling) 汇编( Assembling) 链接( Linking)Linux程序员可以根据自己的需要让GCC 在编译的任何阶段结束, 以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。和其它常用的编译器一样,GCC 也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。GCC 提供了 30 多条警告信息和三个警告级别,使用它们有助
3、于增强程序的稳定性和可移植性。此外, GCC 还对标准的C 和 C+ 语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。GCC 起步在学习使用 GCC 之前,下面的这个例子能够帮助用户迅速理解GCC 的工作原理,并将其立即运用到实际的项目开发中去。首先用熟悉的编辑器输入清单1 所示的代码:清单 1 :hello.c #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - int
4、 main(void) printf (Hello world, Linux programming!n); return 0; 然后执行下面的命令编译和运行这段程序: # gcc hello.c -o hello # ./hello Hello world, Linux programming! 从程序员的角度看,只需简单地执行一条GCC 命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。首先,GCC 需要调用预处理程序cpp ,由它负责展开在源文件中定义的宏,并向其中插入“#include ” 语句所包含的内容;接着,GCC 会调用 ccl 和 as 将处理后的源代码编译
5、成目标代码;最后, GCC 会调用链接程序ld ,把生成的目标代码链接成一个可执行程序。为了更好地理解GCC 的工作过程,可以把上述编译过程分成几个步骤单独进行,并观察每步的运行结果。第一步是进行预编译,使用-E 参数可以让GCC 在预处理结束后停止编译过程: # gcc -E hello.c -o hello.i 此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码, 这可以通过使用-c 参数来完成: # gcc -c hello.i -o hello.o GCC 默认将
6、 .i 文件看成是预处理后的C 语言源代码, 因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x 参数让 GCC 从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件: # gcc hello.o -o hello 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 在采用模块化的设计思想进行软件开发时,通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC 能够很好地管理这些编译单
7、元。假设有一个由foo1.c和 foo2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序foo ,可以使用下面这条命令: # gcc foo1.c foo2.c -o foo 如果同时处理的文件不止一个,GCC 仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令: # gcc -c foo1.c -o foo1.o # gcc -c foo2.c -o foo2.o # gcc foo1.o foo2.o -o foo 在编译一个包含许多源文件的工程时,若只用一条GCC 命令来完成编译是非常浪费时间的。假设项目中有100 个源
8、文件需要编译,并且每个源文件中都包含10000行代码,如果像上面那样仅用一条 GCC 命令来完成编译工作,那么GCC 需要将每个源文件都重新编译一遍,然后再全部连接起来。很显然,这样浪费的时间相当多,尤其是当用户只是修改了其中某一个文件的时候,完全没有必要将每个文件都重新编译一遍,因为很多已经生成的目标文件是不会改变的。要解决这个问题,关键是要灵活运用GCC ,同时还要借助像Make 这样的工具。警告提示功能GCC 包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码。先来读读清单2 所示的程序,这段代码写得很糟糕,仔细检查一下不难挑出很多毛病:main函数的
9、返回值被声明为void ,但实际上应该是int ;使用了 GNU 语法扩展, 即使用 long long来声明 64 位整数, 不符合 ANSI/ISO C语言标准;main函数在终止前没有调用return语句。清单 2 :illcode.c #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - void main(void) long long int var = 1; printf(It is not stan
10、dard C code!n); 下面来看看GCC 是如何帮助程序员来发现这些错误的。当GCC 在编译不符合ANSI/ISO C 语言标准的源代码时,如果加上了-pedantic选项,那么使用了扩展语法的地方将产生相应的警告信息: # gcc -pedantic illcode.c -o illcode illcode.c: In function main: illcode.c:9: ISO C89 does not support long long illcode.c:8: return type of main is not int 需要注意的是, -pedantic编译选项并不能保证被
11、编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合ANSI/ISO C 标准的代码,但不是全部,事实上只有ANSI/ISO C 语言标准中要求进行编译器诊断的那些情况,才有可能被GCC 发现并提出警告。除了 -pedantic之外, GCC 还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W 开头,其中最有价值的当数-Wall 了,使用它能够使GCC 产生尽可能多的警告信息: # gcc -Wall illcode.c -o illcode illcode.c:8:
12、warning: return type of main is not int illcode.c: In function main: illcode.c:9: warning: unused variable var GCC 给出的警告信息虽然从严格意义上说不能算作是错误,但却很可能成为错误的栖身之所。一个优秀的 Linux 程序员应该尽量避免产生警告信息,使自己的代码始终保持简洁、优美和健壮的特性 。在处理警告方面, 另一个常用的编译选项是-Werror,它要求 GCC 将所有的警告当成错误进行处理,这在使用自动编译工具(如Make等)时非常有用。如果编译时带上-Werror选项,那么G
13、CC 会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改。只有当相应的警告信息消除时,才可能将编译过程继续朝前推进。执行情况如下: # gcc -Wall -Werror illcode.c -o illcode cc1: warnings being treated as errors 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - illcode.c:8: warning: return type of mai
14、n is not int illcode.c: In function main: illcode.c:9: warning: unused variable var 对 Linux程序员来讲, GCC 给出的警告信息是很有价值的,它们不仅可以帮助程序员写出更加健壮的程序,而且还是跟踪和调试程序的有力工具。建议在用GCC 编译源代码时始终带上-Wall选项,并把它逐渐培养成为一种习惯,这对找出常见的隐式编程错误很有帮助。库依赖在 Linux下开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些
15、头文件( .h )和库文件(.so或者 .a)的集合。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下, 而库文件则放到/usr/lib/目录下, 但并不是所有的情况都是这样。正因如此, GCC 在编译时必须有自己的办法来查找所需要的头文件和库文件。GCC 采用搜索目录的办法来查找所需要的文件,-I 选项可以向GCC 的头文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/include/目录下有编译时所需要的头文件,为了让GCC能够顺利地找到它们,就可以使用-I 选项: # gcc foo.c -I /home/xiaowp/include -o
16、foo 同样,如果使用了不在标准位置的库文件,那么可以通过-L 选项向 GCC 的库文件搜索路径中添加新的目录。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so,为了让 GCC 能够顺利地找到它,可以使用下面的命令: # gcc foo.c -L /home/xiaowp/lib -lfoo -o foo 值得好好解释一下的是-l 选项,它指示GCC 去连接库文件libfoo.so。Linux下的库文件在命名时有一个约定,那就是应该以lib 三个字母开头,由于所有的库文件都遵循了同样的规范,因此在用 -l 选项指定链接的库文件名时可以省去lib 三个
17、字母, 也就是说 GCC 在对 -lfoo进行处理时,会自动去链接名为libfoo.so的文件。Linux下的库文件分为两大类分别是动态链接库(通常以.so 结尾)和静态链接库(通常以.a 结尾) ,两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - 默认情况下, GCC 在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需
18、要的话可以在编译时加上-static选项,强制使用静态链接库。例如,如果在/home/xiaowp/lib/目录下有链接时所需要的库文件libfoo.so和 libfoo.a,为了让GCC 在链接时只用到静态链接库,可以使用下面的命令: # gcc foo.c -L /home/xiaowp/lib -static -lfoo -o foo 代码优化代码优化指的是编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。GCC 提供的代码优化功能非常强大,它通过编译选项-On 来控制优化代码的生成,其中n 是一个代表优化级别的整数。对于不同版本的GCC
19、来讲, n 的取值范围及其对应的优化效果可能并不完全相同,比较典型的范围是从0 变化到 2 或 3 。编译时使用选项 -O 可以告诉 GCC 同时减小代码的长度和执行时间,其效果等价于-O1 。在这一级别上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳转(Thread Jump)和延迟退栈( Deferred Stack Pops)两种优化。选项-O2 告诉 GCC 除了完成所有 -O1 级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3 则除了完成所有-O2 级别的优化之外,还包括循环展开和其它一些与处理器特性相关的优化工作。通常来说,数字越大优化的
20、等级越高, 同时也就意味着程序的运行速度越快。许多 Linux程序员都喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间,取得了一个比较理想的平衡点。下面通过具体实例来感受一下GCC 的代码优化功能,所用程序如清单3 所示。清单 3 :optimize.c #include int main(void) double counter; double result; double temp; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 13 页 - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年gcc选项及编译过程 2022 gcc 选项 编译 过程
限制150内