1. 程式人生 > >makefile 巢狀

makefile 巢狀

 

目錄結構:

 

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