主要學習如下gcc選項:
-C、-M、-MM、-MD、-MMD、編譯優化選項(-O0、-O1、-O2、-O3)、-Wall
8、-C 選項
在預處理的時候,不刪除註釋信息,一般和-E一起使用。有時候分析程序,比較方便。
比如,加上註釋的這段程序HelloWorld.c程序如下:
#include <stdio.h>
// 我的HelloWorld程序
int main()
{
//打印輸出字符串
printf("Hello,the world!\n");
return 0;
}
[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>
// 我的HelloWorld程序
int main()
{
//打印輸出字符串
printf("Hello,the world!\n");
return 0;
}
使用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");
}
[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: 警告:在有返回值的函數中,控制流程到達函數尾