#------------------------------------------------------------------------------- #=================== # GCC #=================== #處理編譯任務時,分成下面4個步驟: #1.前處理 (preprocessing):使用前處理器(cpp) 將程式檔轉換成 .i (or .ii): .c ->.i 或 .cpp -> .ii 檔 #2.編譯 (compiling):將前處理後的檔轉換成組合語言,轉換成 .s 檔 #3.組譯 (assembly):使用組譯器(gas)將組合語言組譯為 .o 檔 #4.鏈結 (linking):將 .o 檔鏈結成為可執行檔或是函式庫 #------------------------------------------------------------------------------- #=================== # 常用參數 #=================== #-E -- 只進行前處理,不進行編譯,結果由 console 直接輸出。 #-C -- 進行前處理時保留註解。 #-S -- 產生組合語言程式碼(.s)。 #-I -- 指定 INCLUDE PATH (標頭檔.h的搜尋目錄)。 #-L -- 指定 LIBRARY PATH (連結時要用到的函式庫的搜尋目錄)。 #-O -- 最佳化程度,預設就是-O1,你可以指定成-O2或-O3,數字越大表示最佳化程度越好,但是會增加編譯時間。 #-c -- 只編譯不進行連結(產生一個跟原始碼相同名稱的目的檔 .o 檔),留待後面才來連結(link)。 #-l -- 指定要連結的函式庫,(e.g. libc)。 #-o -- 把建立的二位元檔給另外名字,因為可執行檔最後內定名字是a.out。 #-g -- 把偵錯資訊也編譯進去,這樣debug工具ddd,gdb才能除錯。 #-W -- 編譯時出錯時,顯示錯誤訊息的條件。 #-Wall -- 在編譯時顯示更多的警告訊息。這個參數相當有用,特別是找不到libs/headers之類的問題。事實上它並未完全顯示 cc 所能注意到的各項警告訊息。 #-ansi -- 使用相容ANSI標準的編譯方式。關閉 cc 特有的某些特殊非ANSI C標準功能。 事實上它並不保證你的程式會完全符合 ANSI 標準。 #-pedantic -- 全面關閉 cc 所特有的非 ANSI C 標準功能。 #-Dname -- 定義 macro,同 #define。 (條件編譯,搭配#ifdef #define用。如果有defined才編譯) #-Uname -- 解除 macro 定義,同 #undef。 (條件編譯,搭配#ifdef #define用。如果有defined才編譯) #Linking #-static -- 只使用靜態函式庫 #-share -- 儘量使用共享函式庫 #-shared-libgcc -- 指定連結共享的 libgcc #-static-libgcc -- 指定連結靜態的 libgcc #-nostartfiles -- 不使用 standard system startup files (常用於 cross-compiling 時) #-nodefaultlibs -- 不使用系統預設的標準函式庫 #-nostdlib -- 不使用標準函式庫及 startup files #-nostdinc++ -- 不使用 c++ 標準的 #include 檔 #-fPIC -- 產生 position-independent code,常用於共享函式庫的產生 #-Wl,option -- 將 option 傳給 linker,如果有多個 option ,使用逗號(,)隔開。 #e.g. gcc -shared -o myshared -Wl,--whole-archive -llib1 -llib2 -Wl,--no-whole-archive a.o b.o c.o #------------------------------------------------------------------------------- #=================== # automatic variables #=================== #$* 目標檔之主檔名(if the target is dir/a.foo.b and the target pattern is a.%.b then dir/a.foo) # $@ 目標檔之全檔名 # $% 程式庫成員中的檔名元素 # $< 第一個prequeite的檔名 # $? Timestamp 在Target之後的Prequeite # $^ 所有的Prequeite的檔名 但不包含重複部分 # $+ 所有的Prequeite的檔名 # $(@D) $( $(BINNAME).lst # ls -lh $< #$(BINNAME).axf: $(COBJS) $(BINNAME).bin : $(COBJS) $(CC) -nostartfiles -static -o $@ $(COBJS) %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< #$(CC) $(CFLAGS) -c $< -o $@ %.o: %.S $(CC) $(ASFLAGS) -c -o $@ $< .PHONY: clean clean: #rm -rf $(BINNAME).bin $(BINNAME).axf $(BINNAME).lst *.o *~ */*~ rm -rf *.o *.bak #if [ -f *.o ]; then rm -f *.o; fi; #=================== # make the library #=================== #all: $(PROJ) # ## 這是 makedepend 的用法!會自動幫你找出相依性,只要輸入原始檔和參數即可 #cdepend: $(CSRCS) #makedepend $(CFLAGS) $(INCLUDES) $(CSRCS) # #cppdepend: $(CPPSRCS) #makedepend $(CPPFLAGS) $(INCLUDES) $(CPPSRCS) # #$(PROJ): $(COBJS) $(CPPOBJS) #$(AR) $(ARFLAGS) $@ $(COBJS) $(CPPOBJS) # 合成函式庫 #$(RANLIB) $@ # 產生函式庫中的索引 # #clean: #rm -f $(PROJ) # 刪除二進位檔 #rm -f $(COBJS) # 刪除 C 的目的檔 #rm -f $(CPPOBJS) # 刪除 C++ 的目的檔 #-------------------------------------------------------------------------------
文章標籤
全站熱搜
創作者介紹
創作者 BB 的頭像
BB

Welkin小窩

BB 發表在 痞客邦 留言(0) 人氣(1,767)