1. 程式人生 > >makefile 和 編譯條件 的簡略總結

makefile 和 編譯條件 的簡略總結

#-g 
gdb可看程式碼

#-fPIC 
-fPIC 的使用,會生成 PIC 程式碼,.so 要求為 PIC,以達到動態連結的目的,否則,無法實現動態連結。
-fPIC 作用於編譯階段,告訴編譯器產生與位置無關程式碼(Position-Independent Code),則產生的程式碼中,沒有絕對地址,全部使用相對地址,故而程式碼可以被載入器載入到記憶體的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被載入時,在記憶體的位置不是固定的。
https://blog.csdn.net/derkampf/article/details/69660050

#-O2
-O1 提供基礎級別的優化
-O2 提供更加高階的程式碼優化,會佔用更長的編譯時間
-O3 提供最高階的程式碼優化 https://blog.csdn.net/xinianbuxiu/article/details/51844994 #-ldl ldl選項,表示生成的物件模組需要使用共享庫 https://blog.csdn.net/hlzs_01/article/details/39337557 #-s 這個引數會把符號表從最終的可執行檔案中刪除。沒有符號表,你就不能用gdb除錯了 #-shared 生成共享目標檔案。通常用在建立共享庫時。 #ar ar命令是Linux的一個備份壓縮命令,可以建立、修改備存檔案(archive),或從備存檔案中抽取成員檔案。備存檔案以一定的結構打包一個至多個其它檔案(即成員檔案),且成員檔案的內容、模式、時間戳等資訊將被儲存在備存檔案中。 常見的應用是,使用ar命令將多個目標檔案(
*.o)打包為靜態連結庫檔案(*.a)。 引數 -r 將檔案插入備存檔案中 -s 等價於執行ranlib。 (ranlib更新庫的有效符號表) c 建立備存檔案。 v 程式執行時顯示詳細的資訊。 ####################makefile https://www.cnblogs.com/wang_yb/p/3990952.html target ... : prerequisites ... command ... ... target - 目標檔案, 可以是 Object File, 也可以是可執行檔案 makefile中的每個標的(target)都代表了一個檔案。 如果只執行make命令,那麼預設執行第一個標的。 執行一個標的時,會做兩件事情:    檢視與這個標的同名的檔案是否存在,如果不存在,那麼就執行這個標的下面的命令。    如果與這個標的同名的檔案已經存在,那麼就檢查與這個標的同名的檔案是否需要更新(即標的檔案的修改時間是否早於依賴檔案的修改時間),如果需要更新,那麼就執行這個標的下面的命令。 prerequisites
- 生成 target 所需要的檔案或者目標(依賴檔案) command - make需要執行的命令 (任意的shell命令), Makefile中的命令必須以 [tab] 開頭 顯示規則 :: 說明如何生成一個或多個目標檔案(包括 生成的檔案, 檔案的依賴檔案, 生成的命令) 隱晦規則 :: make的自動推導功能所執行的規則 變數定義 :: Makefile中定義的變數 檔案指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定義一個多行命令 註釋 :: Makefile只有行註釋 "#", 如果要使用或者輸出"#"字元, 需要進行轉義, "\#" #vpath vpath pattern path : 符合pattern的檔案在path目錄搜尋。 vpath pattern : 清除pattern指定的檔案搜尋路徑 vpath : 清除所有檔案搜尋路徑。 VPATH:官方解釋為一般搜尋,大寫的VPATH是make中一種特殊變數,這個變數指定了make中的依賴檔案的路徑,用空格或者冒號將多個路徑隔開。 VPATH = dir1:dir2:dir3 或 VPATH = dir1 dir2 dir3 vpath:官方解釋為選擇性搜尋,小寫的vpath,這是make中的一個關鍵字,通俗來講就是在指定路徑中尋找指定型別的檔案,vpath的用法要比VPATH更加靈活。用空格或者冒號將多個路徑隔開,這個和VPATH一樣。 vpath %.c dir1 dir2 dir3 #dir dir $(CPP_SOURCES) 獲取各個檔案路徑,以空格隔開返回 #字首 不用字首 :: 輸出執行的命令以及命令執行的結果, 出錯的話停止執行 字首 @ :: 只輸出命令執行的結果, 出錯的話停止執行 字首 - :: 命令執行有錯的話, 忽略錯誤, 繼續執行 #偽目標 PHONY 目標並非實際的檔名:只是在顯式請求時執行命令的名字。有兩種理由需要使用PHONY 目標:避免和同名檔案衝突,改善效能。 .PHONY: clean clean: -rm -rf $(OBJ_PATH) 這裡clean目標沒有依賴檔案 #引用其他的 Makefile 語法: include <filename> (filename 可以包含萬用字元和路徑) # 自動變數 Makefile 中很多時候通過自動變數來簡化書寫, 各個自動變數的含義如下: [email protected] 目標集合 $< 第一個依賴目標. 如果依賴目標是多個, 逐個表示依賴目標 $^ 所有依賴目標的集合, 會去除重複的依賴目標 #notdir 1、wildcard : 擴充套件萬用字元 2、notdir : 去除路徑 3、patsubst :替換萬用字元 .c變.o 在test下,建立a.c和b.c2個檔案,在sub目錄下,建立sa.c和sb.c2 個檔案 src=$(wildcard *.c ./sub/*.c) @echo $(src) #輸出 a.c b.c ./sub/sa.c ./sub/sb.c dir=$(notdir $(src)) @echo $(dir) # a.c b.c sa.c sb.c obj=$(patsubst %.c,%.o,$(dir) ) @echo $(obj) # a.o b.o sa.o sb.o 或者可以使用 obj=$(dir:%.c=%.o) $(var:a=b) 或 ${var:a=b} 它的含義是把變數var中的每一個值結尾用b替換掉a https://blog.csdn.net/srw11/article/details/7516712