gcc學習與實踐(2)


主要學習如下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;
}

如果只是使用-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>
// 我的HelloWorld程序
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: 警告:在有返回值的函數中,控制流程到達函數尾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章