1.静态库和动态库
LIB_NAME = XXX
STATIC_NAME = lib$(LIB_NAME).a
SHARE_NAME = lib$(LIB_NAME).so
all:$(STATIC_NAME) $(SHARE_NAME)
CC = gcc
AR = ar
# (A B C D)为文件夹目录
SOURCE = $(wildcard *.c ./A/*.c ./B/*.c ./C/*.c ./D/*.c)
OBJ = $(patsubst %.c, %.o, $(SOURCE))
#链接其他依赖库
LIBS = -ljpeg
#依赖库库路径
LIB_PATH = -L./lib\
#头文件路径
INCLUDES = -I./A\
-I./B\
-I./C\
-I./D\
CFLAGS = -Wall -c -lpthread -std=gnu99 -lm -lstdc++ $(LIB_PATH) $(LIBS)
#编译为静态库
%.o: %.c
$(CC) $(INCLUDES) $(CFLAGS) $< -o $@ -DDEBUG
$(STATIC_NAME): $(OBJ)
@mkdir -p output/
$(AR) -crv output/$(STATIC_NAME) $(OBJ)
#编译为动态库
$(SHARE_NAME): $(OBJ)
$(CC) -shared -fPIC -o output/$(SHARE_NAME) $(SOURCE) $(INCLUDES) -DDEBUG
.PHONY: clean
clean:
rm -rf $(OBJ) output/
2.应用程序
#自定义软件版本
VERSION = 1.0.0
#添加源文件(A 为文件夹)
SOURCE = $(wildcard *.c) $(wildcard ./A/*.c)
OBJ = $(patsubst %.c, %.o, $(SOURCE))
#添加头文件(A B C D 为文件夹路径)
INCLUDES = -I./A/xxx\
-I./B/xxx\
-I./C/xxx\
-I./D/xxx\
#链接依赖库
LIBS = -pthread -lxxx
#添加依赖库路径
LIB_PATH = -L./xxx/xxx\
CFLAGS = -Wall -c
TARGET = appname
CC = gcc
$(TARGET): $(OBJ)
@mkdir -p output/
$(CC) $(OBJ) $(LIB_PATH) $(LIBS) -o output/$(TARGET).$(VERSION)
%.o: %.c
$(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
.PHONY: clean
clean:
rm -rf $(OBJ) output/
3.c和cpp混合
#自定义软件版本
VERSION = 1.0.0
#添加源文件(A B C D 为文件夹路径)
SOURCEC = $(wildcard ./A/*.c)\
$(wildcard ./B/*.c)\
SOURCECPP = $(wildcard ./*.cpp)\
$(wildcard ./C/*.cpp)\
$(wildcard ./D/*.cpp)\
OBJ = $(patsubst %.cpp, %.o, $(SOURCECPP)) $(patsubst %.c, %.o, $(SOURCEC))
#添加头文件(A B C D 为文件夹路径)
INCLUDES = -I./\
-I./A\
-I./B\
-I./C\
-I./D\
#链接依赖库
LIBS = -lpthread -lm -lXX
#添加依赖库路径
LIB_PATH = -L./XX\
CFLAGS = -Wall -std=c++11 -O3 -lstdc++ -g -rdynamic -DDEBUG -shared -fPIC
TARGET = appname
CPP = xxg++
$(TARGET): $(OBJ)
@mkdir -p output/
$(CPP) $(OBJ) $(LIB_PATH) $(LIBS) -o output/$(TARGET).$(VERSION)
%.o: %.cpp
$(CPP) -c $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
%.o: %.c
$(CPP) -c $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
.PHONY: clean
clean:
rm -rf $(OBJ) output/