2008年8月22日 星期五

C++ - 參數

參數: -O (大寫)
說明: 在編譯過程做最佳化,以提升增快程式執行速度,好像可以分為O、O0、O1、O2、O3之類的,數字越大,最佳化越好

gcc怎麼知道去哪裡找foo.c裡面所include的header檔,連結資料庫與系統定義呢? 總共有下列來源指定gcc去那找。
1. 當初在編譯時指定的(在~gcc/gcc/collect2.c:locatelib()
2. 寫在specs內的
3. 後來用-D -I -L指定的
4. gcc環境變數設定(編譯的時候)
5. ld.so的環境變數(這是run time的時候)

參數: -I dir_name
說明: 將目錄 'dir_name' 設定為搜尋標頭檔目錄之一。
簡化: -I
所以header file的搜尋會從
1. -I開始然後找gcc的環境變數
2. C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3. 再找上述的內定目錄

參數: -L dir_name
說明: 將目錄 'dir_name' 設定為搜尋程式庫目錄之一。
簡化: -L
尋找library是由以下路徑順序去尋找的
1. LD_LIBRARY_PATH 或LD_AOUT_LIBRARY_PATH環境變數所指的路逕
2. ldconfig所建立的cache
3. /lib /usr/lib內的檔

參數: -l name
說明: 聯結程式庫 libname.a 。

範例一:本例中假設你的程式檔名為test.cpp,數學函數如 sin等,所要聯結的程式庫為 libm.a。

[root@host ~]# g++ -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 test.c -o test

範例二:本例中假設你的程式檔名為 test.c,使用到 X window 函數,所需的 include 檔放在 /usr/X11R6/include 中,所須聯結的程式庫放在 /usr/X11R6/lib,所要聯結的程式庫為 libX11.a。

[root@host ~]# g++ -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 test.c -o test



提供進一步的資訊以便使用者找尋程式中的錯誤。
參數: -Wall
說明: 輸出較多的警告訊息,以便找出程式的錯誤。


參數: -g

說明: 在編譯出可執行檔時,附加執行時除錯資訊,以供 gdb 讀取 (若要使用 ABSoft 的除錯程式,則須將參數改為 -gdwarf )。

參數: -c
說明: 僅編譯成 object 檔而不進行程式庫聯結。


參數: -E
說明:展開程式中的巨集以便了解巨集是否依照預期方式展開。


聯結數個 object 成可執行檔。
參數: -o
範例: 將 'test1.o'、'test2.o' 和程式庫聯結後成為可執行檔 test。

[root@host ~]# g++ test1.o test2.o -o test


參數: -S
範例:編譯 test.c 產生對應的組合語言程式碼檔 test.s。

[root@host ~]# g++ -c test.c -S test.s


[2009.03.05 補充]
參數: -D
說明:定義MARCO及變數
例子:
hello.c

#include <stdio.h>
int main()
{
#ifndef MARS
printf("Hello Mars!\n");
#else
printf("Hello World!\n");
#endif
return 0;
}

$ gcc -o hello hello.c
$ gcc -o mars hello.c -DMARS

執行之後,就會發現有什麼不同啦~
這一個在相同的程式,定義要不要印出debug內容非常有效哩~
或是有多種情況,可以不用在修改程式碼的情況下,出現不同的執行檔哩~

另外也可以定義macro的數值哩
例如:$ gcc -o mars hello.c -DMARS=33表示定義MARS為33

[2011.07.15 補充]
透過D來設定數字字串
main.c
#include <stdio.h>

int main(void) {
#ifdef TEST
printf ("TEST defined %d\n", TEST);
#else //#ifdef TEST
printf ("TEST not defined\n");
#endif //#ifdef TEST

#ifdef STRING1
printf ("STRING1 defined %s\n", STRING1);
#else //#ifdef STRING1
printf ("STRING1 not defined\n");
#endif //#ifdef STRING1

return 0;
}


指令
cl /DTEST#1 /DSTRING1="\"ABC"\"


參考資料:GCC G++
標頭檔 函式庫與gcc
/D (前置處理器定義)
如何在-D define 中加入string

沒有留言: