1. 程式人生 > 實用技巧 >Makefile 編譯與連結選項及CFLAGS與LDFLAGS

Makefile 編譯與連結選項及CFLAGS與LDFLAGS

本文轉載自:https://blog.csdn.net/zhaoyun_zzz/article/details/82466031

近看了makefile的手冊之後,發現還是不知道怎麼寫makefile,而且就連看也看的是雲裡霧裡,就我現在工作當中看到的一些makefile檔案,只能看個大概的意思,一旦涉及到檔案新增、靜態庫、動態庫等增加、刪除;檔案搜尋路徑等的修改就沒法下手了,因此下定決心必須對我比較關注的地方進行深度學習,知其然還要知其所以然,知道怎麼從無到有寫出來,而且別人的makefile還要知道怎麼根據需求的變化進行修改。但這不是一步就能能達到的,咱還是先全面理解別人寫的makefile開始吧。
關於makefile的依賴規則以及目標生成的步驟,這篇先不介紹,這裡主要關注我在看makefile時遇到的一堆CFLAGS與LDFLAGS定義進行說明。
費了牛勁,才查到GNUmake中文手冊中關於CFLAGS與LDFLAGS的說明,他們都是是隱含規則的變數,且是一種命令引數變數;然後又到GCC手冊中查詢有哪些編譯選項。
makefile內嵌隱含規則的命令中,所使用的變數都是預定義的變數。我們將這些變數稱為“隱含變數”。這些變數允許對它進行修改:在Makefile中、通過命令列引數或者設定系統環境變數的方式來對它進行重定義。無論是用那種方式,只要make在執行時它的定義有效,make的隱含規則都會使用這些變數。

GCC編譯選項CFLAGS引數

選項說明
-c 用於把原始碼檔案編譯成 .o 物件檔案,不進行連結過程
-o 用於連線生成可執行檔案,在其後可以指定輸出檔案的名稱
-g 用於在生成的目標可執行檔案中,新增除錯資訊,可以使用GDB進行除錯
-Idir 用於把新目錄新增到include路徑上,可以使用相對和絕對路徑,“-I.”、“-I./include”、“-I/opt/include”
-Wall 生成常見的所有告警資訊,且停止編譯,具體是哪些告警資訊,請參見GCC手冊,一般用這個足矣!
-w 關閉所有告警資訊
-O 表示編譯優化選項,其後可跟優化等級0\1\2\3,預設是0,不優化
-fPIC 用於生成位置無關的程式碼
-v (在標準錯誤)顯示執行編譯階段的命令,同時顯示編譯器驅動程式,前處理器,編譯器的版本號

GCC連結選項LDFLAGS引數

選項說明
-llibrary 連結時在標準搜尋目錄中尋找庫檔案,搜尋名為liblibrary.aliblibrary.so
-Ldir 用於把新目錄新增到庫搜尋路徑上,可以使用相對和絕對路徑,“-L.”、“-L./include”、“-L/opt/include”
-Wl,option 把選項 option 傳遞給聯結器,如果 option 中含有逗號,就在逗號處分割成多個選項
-static 使用靜態庫連結生成目標檔案,避免使用共享庫,生成目標檔案會比使用動態連結庫大

例項

CFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
LDFLAGS = -L./lib
ALL:
    $(CC) $(CFLAGS) $(LDFLAGS) main.c gfifo.c queue.c usbmonitor.c socket_rcv_360_server.c ./lib/srs_librtmp.a ./lib/libcrypto.a ./lib/libssl.a ./lib/libtinyalsa.a -o media_record -static -ldl -lstdc++ -lm -lpthread
clean:
    rm media_record *.raw *.mp4 *.wav -rf

CFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
-g:生成除錯資訊
-Wall:輸出全部的告警資訊
-I./include:新增標頭檔案搜尋目錄./include
-I./include/tinyalsa:新增標頭檔案搜尋目錄./include/tinyalsa
-Wl,--whole-archive -lpthread:將libpthread.so及以後的庫中的所有符號都連結進可執行目標檔案
-Wl,--no-whole-archive:關閉之前的-Wl,--whole-archive -lpthread 選項
LDFLAGS = -L./lib,將makefile當前目錄下的、lib資料夾新增到庫檔案搜尋目錄

$(CC):makefile隱含變數,預設選擇gcc編譯器
$(CFLAGS):引用之前定義的CFLAGS變數,即編譯選項引數
$(LDFLAGS):引用之前定義的LDFLAGS變數,即連結引數

$(CC) $(CFLAGS) $(LDFLAGS) main.c gfifo.c queue.c usbmonitor.c socket_rcv_360_server.c ./lib/srs_librtmp.a ./lib/libcrypto.a ./lib/libssl.a ./lib/libtinyalsa.a -o media_record -static -ldl -lstdc++ -lm -lpthread
使用定的編譯器、編譯選項引數、連結選項引數,編譯.c檔案,並使用靜態方式連結制定的庫檔案,以及編譯器目錄下的libdl.a、libstdc++.a、libm.a、libpthread.a庫檔案生成 media_record 可執行目標檔案。