目录结构:
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 $@ # .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