主要学习如下gcc选项: -C、-M、-MM、-MD、-MMD、编译优化选项(-O0、-O1、-O2、-O3)、-Wall |
8、-C 选项
在预处理的时候,不删除注释信息,一般和-E一起使用。有时候分析程序,比较方便。
比如,加上注释的这段程序HelloWorld.c程序如下:
#include <stdio.h> int main() { printf("Hello,the world!\n"); return 0; } |
如果只是使用-E选项进行编译:
[root@shirdrn junys]# gcc -E HelloWorld.c > HelloWorld.c.ignorecomments.txt
则会忽略注释,从而加快预处理过程,导出生成的HelloWorld.c.ignorecomments.txt文件就比使用-C和-E一起进行编译生成的导出文件大很多:
[root@shirdrn junys]# gcc -C -E HelloWorld.c > HelloWorld.c.txt
HelloWorld.c.txt文件为2582行,HelloWorld.c.ignorecomments.txt文件为934行。
9、 -M 选项
生成当前编译程序文件关联的详细信息,包含目标文件所依赖的所有源代码文件,包括头文件。
比如,使用-M选项进行编译:
[root@shirdrn junys]# gcc -M HelloWorld.c
生成的关联文件的信息如下所示:
HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ /usr/lib/gcc/i386-redhat-linux/4.1.2/include/stddef.h \ /usr/include/bits/types.h /usr/include/bits/typesizes.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ /usr/lib/gcc/i386-redhat-linux/4.1.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h |
10、-MM 选项
同-M选项一样,不同的是,它将忽略由#include 包含的头文件所造成的文件之间的依赖关系。
比如,使用-MM选项进行编译:
[root@shirdrn junys]# gcc -MM HelloWorld.c
只要与#include <stdio.h>中有关联的文件信息都不会显示出来,如下所示:
[root@shirdrn junys]# gcc -MM HelloWorld.c HelloWorld.o: HelloWorld.c [root@shirdrn junys]# |
11、-MD 选项
同-M选项相同,生成当前编译程序文件关联的详细信息,包含目标文件所依赖的所有源代码文件,包括头文件,但是,信息输出将导入到.d的文件里面。
比如使用-MD选项进行编译:
[root@shirdrn junys]# gcc -MD HelloWorld.c
编译结果是,生成一个HelloWorld.d文件,该文件包含了于程序文件关联的文件的信息,HelloWorld.d文件内容如下所示:
HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \ /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h \ /usr/lib/gcc/i386-redhat-linux/4.1.2/include/stddef.h \ /usr/include/bits/types.h /usr/include/bits/typesizes.h \ /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ /usr/lib/gcc/i386-redhat-linux/4.1.2/include/stdarg.h \ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h |
12、-MMD 选项
同-MM选项相同,将忽略由#include 包含的头文件所造成的文件之间的依赖关系,但是,信息输出将导入到.d的文件里面。
比如使用-MMD选项进行编译:
[root@shirdrn junys]# gcc -MD HelloWorld.c
编译结果是,生成一个HelloWorld.d文件,该文件包含了于程序文件关联的文件的信息,HelloWorld.d文件内容如下所示:
HelloWorld.o: HelloWorld.c |
13、优化选项
编译器优化主要有下面四个选项:
-O0
-O1
-O2
-O3
-O0选项表示没有优化;-O1选项为缺省值;-O3选项表示优化级别最高。
但是,需要明确一点,优化级别越高,编译的速度会越慢的。
使用比这段程序HelloWorld.c程序如下:
#include <stdio.h> int main() { printf("Hello,the world!\n"); return 0; } |
通过使用O0和O3级别的优化选项进行一下对比吧。
使用O0优化级别进行编译,如下所示:
[root@shirdrn junys]# time gcc -o O0HelloWorld -O0 HelloWorld.c real 0m1.003s user 0m0.142s sys 0m0.061s |
使用O3优化级别进行编译,如下所示:
[root@shirdrn junys]# time gcc -o O3HelloWorld -O3 HelloWorld.c real 0m1.067s user 0m0.142s sys 0m0.053s |
优化级别越高,运行程序的效率是越高的,可以通过使用上面的两个级别编译的程序,进行一下运行效率的对比,如下所示:
[root@shirdrn junys]# time ./O0HelloWorld Hello,the world! real 0m0.014s user 0m0.000s sys 0m0.002s [root@shirdrn junys]# time ./O3HelloWorld Hello,the world! real 0m0.003s user 0m0.000s sys 0m0.003s |
由于HelloWorld.c这个程序过于简单了,所以测试比较不是很明显,你可以尝试使用一个更加复杂的程序进行测试一下。
14、-Wall 选项
用于输出警告信息。
例如,这段程序HelloWorld.c,没有返回语句return 0;,程序如下:
#include <stdio.h> int main() { printf("Hello,the world!\n"); } |
正常情况下进行编译,没有任何错误信息,编译通过,但是如果指定了-Wall选项进行编译,会输出警告信息:
[root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c HelloWorld.c: 在函数 ‘main’ 中: HelloWorld.c:8: 警告:在有返回值的函数中,控制流程到达函数尾 |
再比如,在程序中定义了变量但是没有使用到:
#include <stdio.h> int main() { int cnt = 100; printf("Hello,the world!\n"); } |
也会提示警告信息:
[root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c HelloWorld.c: 在函数 ‘main’ 中: HelloWorld.c:6: 警告:未使用的变量 ‘cnt’ HelloWorld.c:9: 警告:在有返回值的函数中,控制流程到达函数尾 |