Makefile的簡單使用
阿新 • • 發佈:2018-12-23
一、Makefile的作用
Makefile檔案實質上就是一個工程程式碼編譯指令碼,一旦寫好,只需要一個make命令,整個工程就會自動按照指令碼的規定方式編譯,極大的提高了軟體開發的效率。
二、make 命令使用
三、通用Makefile框架,適用於一般中小型專案
TARGET := ../bin/main
CC := gcc
INCLUDE:= -I ../include
LIBS:= -lpthread
CSRCS := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(CSRCS))
$(TARGET): $(OBJS)
$(CC) $+ -o [email protected] $(LIBS)
%.o:%.c
$(CC) -c -g $< -o [email protected] $(INCLUDE)
clean:
rm -rf $(OBJS) $(TARGET)
#rm *.o
其中:
TARGET: 為生成的可執行檔案路徑。
INCLUDE : 為工程所包含的標頭檔案路徑。
LIBS : 為工程所依賴的庫的路徑。
[email protected]:目標檔案的名字
$<:構造所需目標檔案列表的第一個檔案的名字
$^:構造所需目標件列表所有檔案的名字
$?:構造所需檔案列表中更新過的檔案
$(basename 檔名):取得檔案的名字(去掉字尾的意思)
例如: $(basename test1.c) ---------> test1
$(wildcard 尋找的檔案):在系統中尋找檔案
例如:$(wildcard *.c) 找到系統中所有後綴為.c的檔案,返回成以空格隔開的一整行字元,如test1.c test2.c test3.c 這樣。
$(patsubst 要被替換的字串,用來替換的字串,被處理的字串):$(subst .c,.o,test1.c test2.c) --------------->test1.o test2.o
四、庫依賴順序
當一個工程連結的庫較多時,很多時候因為庫之間的依賴問題導致一直編譯不過。此時要捋清庫之間的依賴關係,然後按依賴順序(越底層的庫越往後放)連結即可。
順序應該如下:
LIBS := -l(應用層lib) -l(基礎lib) -l(系統lib)
檢視庫依賴關係的命令有為:
# readelf -d [庫名]
# ldd [庫名]