會(huì)不會(huì)寫Makefile,可以從一個(gè)側(cè)面說明一個(gè)人是否具備完成大型工程能力。因?yàn)镸akefile關(guān)系到了整個(gè)工程的編譯規(guī)則。(生成目標(biāo)與所有文件的依賴關(guān)系,源文件的依賴關(guān)系)
靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫的編譯
# 編譯靜態(tài)鏈接庫, c選項(xiàng)表示創(chuàng)建,r選項(xiàng)表示插入/替換
g++ -c ${SRC}
ar cr libxxx.a ${OBJ}
# 編譯動(dòng)態(tài)鏈接庫,-fPIC生成位置獨(dú)立的代碼,動(dòng)態(tài)載入,多個(gè)進(jìn)程可共享
g++ -fPIC -shared -o libxxx.so ${SRC}
通用Makefile: 所有源文件在一個(gè)目錄里
- 使用變量
CC = gcc
XX = g++
# 編譯鏈接選項(xiàng)
CFLAGS = -Wall -O3 -g -c
- 使用通配符
$@ 表示目標(biāo)文件
$^ 表示所有的依賴文件
$< 表示第一個(gè)依賴文件
- 使用變量替換引用
OBJECTS = $(SOURCES:.c=.o)
- 使用內(nèi)置函數(shù)
wildcard : 擴(kuò)展通配符
notdir : 去除路徑
patsubst :替換通配符
For Example:
文件列表
/src
Makefile
sort.c
sort.h
test_sort.c
Makefile
CC = gcc
XX = g++
# 編譯鏈接選項(xiàng)
CFLAGS = -Wall -O3 -g -c
INCLUDES = -I.
LDFLAGS =
# 源文件列表
SOURCES = $(wildcard *.c *.cpp)
# 目標(biāo)文件列表
OBJECTS = $(SOURCES:.c=.o)
# OBJECTS = $(patsubst %.c,%.o,$(patsubst,%.cpp,%.o))
# 可執(zhí)行文件名
TARGET = test_sort
all: $(TARGET)
# 生成可執(zhí)行文件(鏈接)
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
# 生成目標(biāo)文件(編譯)
%.o: %.c
$(XX) $(CFLAGS) $(INCLUDES) $< -o $@
.cpp.o:
$(CC) $(CFLAGS) $(INCLUDES) $< -o $@
# 輔助命令:清除目標(biāo)文件、清除所有生成文件、運(yùn)行可執(zhí)行程序
.PHONY: clean cleanall run
clean:
rm -rf $(OBJECTS)
cleanall:
rm -rf $(OBJECTS) $(TARGET)
run:
./$(TARGET)