主要学习如下gcc选项:主要學習如下gcc選項:


-C、-M、-MM、-MD、-MMD、编译优化选项(-O0、-O1、-O2、-O3)、-Wall -C、-M、-MM、-MD、-MMD、編譯優化選項(-O0、-O1、-O2、-O3)、-Wall




8、-C 选项 8、-C選項

在预处理的时候,不删除注释信息,一般和-E一起使用。在預處理的時候,不刪除註釋信息,一般和-E一起使用。 有时候分析程序,比较方便。有時候分析程序,比較方便。

比如,加上注释的这段程序HelloWorld.c程序如下:比如,加上註釋的這段程序HelloWorld.c程序如下:






#include <stdio.h> #include <stdio.h>
// 我的HelloWorld程序 //我的HelloWorld程序
int main() int main()
{ {
//打印输出字符串 //打印輸出字符串
printf("Hello,the world!\n"); printf("Hello,the world!\n");
return 0; return 0;
} }


如果只是使用-E选项进行编译:如果只是使用-E選項進行編譯:

[root@shirdrn junys]# gcc -E HelloWorld.c > HelloWorld.c.ignorecomments.txt [root@shirdrn junys]# gcc -E HelloWorld.c > HelloWorld.c.ignorecomments.txt

则会忽略注释,从而加快预处理过程,导出生成的HelloWorld.c.ignorecomments.txt文件就比使用-C和-E一起进行编译生成的导出文件大很多:則會忽略註釋,從而加快預處理過程,導出生成的HelloWorld.c.ignorecomments.txt文件就比使用-C和-E一起進行編譯生成的導出文件大很多:

[root@shirdrn junys]# gcc -C -E HelloWorld.c > HelloWorld.c.txt [root@shirdrn junys]# gcc -C -E HelloWorld.c > HelloWorld.c.txt

HelloWorld.c.txt文件为2582行,HelloWorld.c.ignorecomments.txt文件为934行。 HelloWorld.c.txt文件為2582行,HelloWorld.c.ignorecomments.txt文件為934行。

9、 -M 选项 9、 -M選項

生成当前编译程序文件关联的详细信息,包含目标文件所依赖的所有源代码文件,包括头文件。生成當前編譯程序文件關聯的詳細信息,包含目標文件所依賴的所有源代碼文件,包括頭文件。

比如,使用-M选项进行编译:比如,使用-M選項進行編譯:

[root@shirdrn junys]# gcc -M HelloWorld.c [root@shirdrn junys]# gcc -M HelloWorld.c

生成的关联文件的信息如下所示:生成的關聯文件的信息如下所示:







HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \ HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.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/lib/gcc/i386-redhat-linux/4.1.2/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.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/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/stdarg.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 /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h



10、-MM 选项 10、-MM選項

同-M选项一样,不同的是,它将忽略由#include 包含的头文件所造成的文件之间的依赖关系。同-M選項一樣,不同的是,它將忽略由#include包含的頭文件所造成的文件之間的依賴關係。

比如,使用-MM选项进行编译:比如,使用-MM選項進行編譯:

[root@shirdrn junys]# gcc -MM HelloWorld.c [root@shirdrn junys]# gcc -MM HelloWorld.c

只要与#include <stdio.h>中有关联的文件信息都不会显示出来,如下所示:只要與#include <stdio.h>中有關聯的文件信息都不會顯示出來,如下所示:







[root@shirdrn junys]# gcc -MM HelloWorld.c [root@shirdrn junys]# gcc -MM HelloWorld.c
HelloWorld.o: HelloWorld.c HelloWorld.o: HelloWorld.c
[root@shirdrn junys]# [root@shirdrn junys]#



11、-MD 选项 11、-MD選項

同-M选项相同,生成当前编译程序文件关联的详细信息,包含目标文件所依赖的所有源代码文件,包括头文件,但是,信息输出将导入到.d的文件里面。同-M選項相同,生成當前編譯程序文件關聯的詳細信息,包含目標文件所依賴的所有源代碼文件,包括頭文件,但是,信息輸出將導入到.d的文件裡面。

比如使用-MD选项进行编译:比如使用-MD選項進行編譯:

[root@shirdrn junys]# gcc -MD HelloWorld.c [root@shirdrn junys]# gcc -MD HelloWorld.c

编译结果是,生成一个HelloWorld.d文件,该文件包含了于程序文件关联的文件的信息,HelloWorld.d文件内容如下所示:編譯結果是,生成一個HelloWorld.d文件,該文件包含了於程序文件關聯的文件的信息,HelloWorld.d文件內容如下所示:







HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \ HelloWorld.o: HelloWorld.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \ /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.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/lib/gcc/i386-redhat-linux/4.1.2/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.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/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/include/bits/wchar.h /usr/include/gconv.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \
/usr/lib/gcc/i386-redhat-linux/4.1.2/include/stdarg.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 /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h




12、-MMD 选项 12、-MMD選項

同-MM选项相同,将忽略由#include 包含的头文件所造成的文件之间的依赖关系,但是,信息输出将导入到.d的文件里面。同-MM選項相同,將忽略由#include包含的頭文件所造成的文件之間的依賴關係,但是,信息輸出將導入到.d的文件裡面。

比如使用-MMD选项进行编译:比如使用-MMD選項進行編譯:

[root@shirdrn junys]# gcc -MD HelloWorld.c [root@shirdrn junys]# gcc -MD HelloWorld.c

编译结果是,生成一个HelloWorld.d文件,该文件包含了于程序文件关联的文件的信息,HelloWorld.d文件内容如下所示:編譯結果是,生成一個HelloWorld.d文件,該文件包含了於程序文件關聯的文件的信息,HelloWorld.d文件內容如下所示:







HelloWorld.o: HelloWorld.c HelloWorld.o: HelloWorld.c



13、优化选项 13、優化選項

编译器优化主要有下面四个选项:編譯器優化主要有下面四個選項:

-O0 -O0
-O1 -O1
-O2 -O2
-O3 -O3

-O0选项表示没有优化;-O1选项为缺省值;-O3选项表示优化级别最高。 -O0選項表示沒有優化;-O1選項為缺省值;-O3選項表示優化級別最高。

但是,需要明确一点,优化级别越高,编译的速度会越慢的。但是,需要明確一點,優化級別越高,編譯的速度會越慢的。

使用比这段程序HelloWorld.c程序如下:使用比這段程序HelloWorld.c程序如下:






#include <stdio.h> #include <stdio.h>
// 我的HelloWorld程序 //我的HelloWorld程序
int main() int main()
{ {
//打印输出字符串 //打印輸出字符串
printf("Hello,the world!\n"); printf("Hello,the world!\n");
return 0; return 0;
} }


通过使用O0和O3级别的优化选项进行一下对比吧。通過使用O0和O3級別的優化選項進行一下對比吧。

使用O0优化级别进行编译,如下所示:使用O0優化級別進行編譯,如下所示:







[root@shirdrn junys]# time gcc -o O0HelloWorld -O0 HelloWorld.c [root@shirdrn junys]# time gcc -o O0HelloWorld -O0 HelloWorld.c

real    0m1.003s real 0m1.003s
user    0m0.142s user 0m0.142s
sys     0m0.061s sys 0m0.061s



使用O3优化级别进行编译,如下所示:使用O3優化級別進行編譯,如下所示:







[root@shirdrn junys]# time gcc -o O3HelloWorld -O3 HelloWorld.c [root@shirdrn junys]# time gcc -o O3HelloWorld -O3 HelloWorld.c

real    0m1.067s real 0m1.067s
user    0m0.142s user 0m0.142s
sys     0m0.053s sys 0m0.053s



优化级别越高,运行程序的效率是越高的,可以通过使用上面的两个级别编译的程序,进行一下运行效率的对比,如下所示:優化級別越高,運行程序的效率是越高的,可以通過使用上面的兩個級別編譯的程序,進行一下運行效率的對比,如下所示:






[root@shirdrn junys]# time ./O0HelloWorld [root@shirdrn junys]# time ./O0HelloWorld
Hello,the world! Hello,the world!

real    0m0.014s real 0m0.014s
user    0m0.000s user 0m0.000s
sys     0m0.002s sys 0m0.002s



[root@shirdrn junys]# time ./O3HelloWorld [root@shirdrn junys]# time ./O3HelloWorld
Hello,the world! Hello,the world!

real    0m0.003s real 0m0.003s
user    0m0.000s user 0m0.000s
sys     0m0.003s sys 0m0.003s



由于HelloWorld.c这个程序过于简单了,所以测试比较不是很明显,你可以尝试使用一个更加复杂的程序进行测试一下。由於HelloWorld.c這個程序過於簡單了,所以測試比較不是很明顯,你可以嘗試使用一個更加複雜的程序進行測試一下。

14、-Wall 选项 14、-Wall選項

用于输出警告信息。用於輸出警告信息。

例如,这段程序HelloWorld.c,没有返回语句return 0;,程序如下:例如,這段程序HelloWorld.c,沒有返回語句return 0;,程序如下:






#include <stdio.h> #include <stdio.h>

int main() int main()
{ {
printf("Hello,the world!\n"); printf("Hello,the world!\n");
} }


正常情况下进行编译,没有任何错误信息,编译通过,但是如果指定了-Wall选项进行编译,会输出警告信息:正常情況下進行編譯,沒有任何錯誤信息,編譯通過,但是如果指定了-Wall選項進行編譯,會輸出警告信息:








[root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c [root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c
HelloWorld.c: 在函数'main' 中: HelloWorld.c:在函數'main'中:
HelloWorld.c:8: 警告:在有返回值的函数中,控制流程到达函数尾 HelloWorld.c:8:警告:在有返回值的函數中,控制流程到達函數尾


再比如,在程序中定义了变量但是没有使用到:再比如,在程序中定義了變量但是沒有使用到:






#include <stdio.h> #include <stdio.h>

int main() int main()
{ {
int cnt = 100; int cnt = 100;
printf("Hello,the world!\n"); printf("Hello,the world!\n");
} }


也会提示警告信息:也會提示警告信息:






[root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c [root@shirdrn junys]# gcc -o HelloWorld -Wall HelloWorld.c
HelloWorld.c: 在函数'main' 中: HelloWorld.c:在函數'main'中:
HelloWorld.c:6: 警告:未使用的变量'cnt' HelloWorld.c:6:警告:未使用的變量'cnt'
HelloWorld.c:9: 警告:在有返回值的函数中,控制流程到达函数尾 HelloWorld.c:9:警告:在有返回值的函數中,控制流程到達函數尾



 


 

    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()