make file 和 GCC標誌學習
GCC:
-Wall : 打開警告標誌
-std=standard : -ansi 相等 -std=c89
-ansi : 指定代碼應該符合什麽標準。
-c : Compile and assemble, but do not link.
[-Dmacro[=defn]...] : 定義宏
-S | gcc -S sum.c -o sum.s | 要求 gcc 產生組合語言程式碼 |
-E | gcc -E hello.c -o hello.i | 只執行巨集展開, 但不產生目的檔 |
-D | gcc -DDEBUG sum.c -o sum | 定義 #define DEBUG 後才編譯 |
-g | gcc -g sum.c -o sum | 編譯時加入除錯資訊, 讓 gdb 可遠端除錯 |
-c | gcc -c hello.c -o hello.o | 編譯並組譯程式碼, 但不做連結 |
-I | gcc -c -I /home/ccc/include -o hello.o | hello.c 指定引用檔 (*.h) 的路徑 |
-L | gcc -L /home/ccc/lib -o hello hello.o | 指定函式庫 (*.a) 的路徑 |
-l | gcc -L /home/ccc/lib -lm -lpthread -o hello | hello.o 指定函式庫的名稱 |
-shared | gcc -shared a.o b.o c.o -o libabc.so | 產生共享函式庫 (*.so) |
-fPIC | gcc -g -rdynamic -fPIC -o test test.c | 輸出 position-independent code, 一般在輸出動態連結函式庫時使用 |
-Werror | gcc -Werror sum.c -o sum.s | 將警告視為錯誤, 一旦有警告就不輸出目標檔 |
-O0 | gcc -S -O0 sum.c -o sum.s | 不進行最佳化 (預設) |
-O1 | gcc -S -O1 sum.c -o sum.s | 第 1 級的最佳化 (較差) |
-O2 | gcc -S -O2 sum.c -o sum.s | 第 2 級的最佳化 |
-O3 | gcc -S -O3 sum.c -o sum.s | 第 3 級的最佳化 (最高等級) |
-dr | gcc -c -dr sum.c -o sum.o | 輸出 RTL 中間碼 |
make file:
https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html
% 萬用字元、$@ 特殊符號、.PHONY 假目標
$@ 代表工作目標. The file name of the target of the rule.
$^ 代表所有的必要條件
$< 代表第一個必要條件. The name of the first prerequisite.
$? The names of all the prerequisites that are newer than the target, with spaces between them.
$% The target member name, when the target is an archive member.
從1文件夾裏面的makefile開始,
然後包含了$(ROOT)/Make.defines.$(PLATFORM)這個平臺的makefile,他裏面主要定義了:根據這個例子,理解APUE的編譯,那就是
CC是編譯器,COMPILE.c是編譯器.c文件的選項,LINK.c是鏈接.c文件的編譯選項,LDFLAGS是庫文件夾的位置,LDLIBS是外部庫的所有對象(EXTRALIBS沒看到定義),CFLAGS是編譯的標誌
然後在1的makefile中,定義了,如何編譯這個程序。
最後包含$(ROOT)/Make.libapue.inc這個makefile文件,在這個文件裏面,是進入lib這個文件夾,並且進行編譯,
在$(ROOT)/lib的makefile文件裏面,進行了下面的工作, 在這裏面,進行了真正的編譯靜態庫的工作。
AR的參數:
http://blog.csdn.net/zougangx/article/details/3073604
http://www.voidcn.com/blog/yangruibao/article/p-635550.html
-r 將文件插入備存文件中。
v 程序執行時顯示詳細的信息。
make file 和 GCC標誌學習