1. 程式人生 > >Makefile的簡單使用

Makefile的簡單使用

一、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 [庫名]