makefile 巢狀
阿新 • • 發佈:2018-11-10
目錄結構:
dynamic 和 static 兩個目錄實現加法功能, 分別生成動態庫和靜態庫, main.c 主檔案連結加法功能, 終端命令執行: make dynamic=1 則編譯動態庫進行連結 , make 靜態庫編譯
動態庫的makefile內容:
# CROSS_COMPILE := # CC := $(CROSS_COMPILE)gcc # CPP := $(CROSS_COMPILE)g++ TARGET := libadd.so OBJ := sub.o SRCS = $(wildcard *.c) all: $(CC) -c -o $(OBJ) -fPIC $(SRCS) $(CC) -shared -fPIC -o $(TARGET) $(OBJ) .PHONY : clean clean: rm $(OBJ) $(TARGET) -f
靜態庫makefile內容:
# CROSS_COMPILE := # CC := $(CROSS_COMPILE)gcc # CPP := $(CROSS_COMPILE)g++ # AR := $(CROSS_COMPILE)ar TARGET := libadd.a OBJ := sub.o SRCS = $(wildcard *.c) all: $(CC) -c -o $(OBJ) $(SRCS) $(AR) -rcs -o $(TARGET) $(OBJ) .PHONY : clean clean: rm $(OBJ) $(TARGET) -f
根目錄的makefile內容:
CROSS_COMPILE := CC = $(CROSS_COMPILE)gcc AR = $(CROSS_COMPILE)AR CPP = $(CROSS_COMPILE)g++ LD = $(CROSS_COMPILE)ld NM = $(CROSS_COMILE)nm STRIP = $(CROSS_COMPILE)strip OBJDUMP = $(CROSS_COMPILE)objdump OBJCOPY = $(CROSS_COMPILE)objcopy ifndef dynamic LIBPATH := static else LIBPATH := dynamic endif CFLAGS := -Wall -O2 -g CFLAGS += -I $(shell pwd)/$(LIBPATH) LDFLAGS := -lm -L$(LIBPATH) -ladd TOPDIR := $(shell pwd) SRCS = $(wildcard *.c) TARGET := main OBJ := main.o all:$(TARGET) # $(TARGET): 這種方式不會自動推導呼叫 %.o:%.c 這個內容 $(TARGET):$(OBJ) make -C $(LIBPATH) $(CC) $(OBJ) $(CFLAGS) $(LDFLAGS) -o $(TARGET) # 這樣放會出現找不到連結庫的問題,原始檔要放在連結庫前面 # $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(SRCS) %.o:%.c $(CC) -c $(CFLAGS) $^ -o[email protected] # .PHONY是一個偽目標,可以防止在Makefile中定義的只執行命令的目標和工作目錄下的實際檔案出現名字衝突 .PHONY : clean clean: make -C $(LIBPATH) clean rm $(OBJ) $(TARGET) -f
原始碼下載路徑: https://download.csdn.net/download/aba13579/10777167
參考連結: https://blog.csdn.net/qq_21792169/article/details/50448639