给大家分享我写的两个makefile,一个生成可执行程序的,一个生成库(动态库、静态库)的。注释都比较详细,不懂的可以来问小弟。
一、生成执行程序示例
#程序版本号
VERSION = 1.0.0
BINNAME = app
TARGET := $(BINNAME)
#编译器
CC = g++
#编译标志位
CFLAGS = -std=c++11 -c -w
debug = no
ifeq ($(debug), yes) #如果debug=yes 则编译debug版本
CFLAGS += -g #编译标志位
TARGET := $(TARGET)_d.$(VERSION) #输出文件名字
DEBUG = -D MYDEBUG #宏定义
TARGET_PATH = Debug/$(VERSION) #程序输出目录
else
CFLAGS += -O3 #编译标志位
TARGET := $(TARGET).$(VERSION) #输出文件名字
TARGET_PATH = Release/$(VERSION) #程序输出目录
endif
#生成文件的md5
TARGET_MD5 = file.md5
#头文件路径
INCLUDES = -I./include
#源程序目录
SOURCE_DIR = ./
#库文件目录
LIB_PATH = -L./lib
#库文件名字
LIBS = -ldl -lstdc++
#.o输出目录
OBJECTS_PATH = objects
#搜索.c文件,目录深度为1
SOURCE_C = $(shell find $(SOURCE_DIR) -maxdepth 1 -name '*.c')
# 生成需要输出的 .o 文件名
OBJ_1 = $(notdir $(patsubst %.c, %.o, $(SOURCE_C)))
# 加上 .o 文件存放路径前缀
OBJECTS_C = $(foreach file, $(OBJ_1), $(OBJECTS_PATH)/$(file))
#搜索.cpp文件,目录深度为1
SOURCE_CPP = $(shell find $(SOURCE_DIR) -maxdepth 1 -name '*.cpp')
# 生成需要输出的 .o 文件名
OBJ_2 = $(notdir $(patsubst %.cpp, %.o, $(SOURCE_CPP)))
# 加上 .o 文件存放路径前缀
OBJECTS_CPP = $(foreach file, $(OBJ_2), $(OBJECTS_PATH)/$(file))
#SOURCE_C = $(wildcard ./*.c) #获取所有的.c文件
#SOURCE_CPP = $(wildcard ./*.cpp) #获取所有的.cpp文件
#OBJ_C = $(patsubst %.c, %.o, $(SOURCE_C)) #将.c文件转为.o文件
#OBJ_CPP = $(patsubst %.cpp, %.o, $(SOURCE_CPP)) #将.cpp文件转为.o文件
$(TARGET):$(OBJECTS_C) $(OBJECTS_CPP) | $(TARGET_PATH)
$(CC) $(OBJECTS_CPP) $(OBJECTS_C) $(LIB_PATH) $(LIBS) -o $(TARGET)
cp $(TARGET) $(TARGET_PATH)
md5sum $(TARGET) > $(TARGET_MD5)
cp $(TARGET_MD5) $(TARGET_PATH)
@echo
@echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>SUCCESS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
@echo "outfile:"$(shell pwd)/$(TARGET_PATH)/$(TARGET)
more $(TARGET_MD5)
@echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>SUCCESS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
@echo
$(OBJECTS_C):$(OBJECTS_PATH)/%.o: %.c | $(OBJECTS_PATH)
@echo SOURCE_C:$(SOURCE_C)
@echo OBJ_1:$(OBJ_1)
@echo OBJECTS_C:$(OBJECTS_C)
$(CC) $(CFLAGS) $(INCLUDES) $(DEBUG) $< -o $@
$(OBJECTS_CPP):$(OBJECTS_PATH)/%.o: %.cpp | $(OBJECTS_PATH)
@echo SOURCE_CPP:$(SOURCE_CPP)
@echo OBJ_2:$(OBJ_2)
@echo OBJECTS_CPP:$(OBJECTS_CPP)
$(CC) $(CFLAGS) $(INCLUDES) $(DEBUG) $< -o $@
#$(OBJ_C):%.o: %.c
# $(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
#$(OBJ_CPP):%.o: %.cpp
# $(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
$(OBJECTS_PATH):
if [ ! -d $@ ]; then mkdir -p $@; fi #创建一个目录,用于存放已编译的目标
$(TARGET_PATH):
if [ ! -d $@ ]; then mkdir -p $@; fi #创建一个目录,用于存放最终输出文件
.PHONY: clean
clean:
rm -f $(TARGET)
rm -rf $(OBJECTS_PATH)
可选参数debug,可生成debug版本。
make debug=yes
二、生成库(动态库、静态库)
#程序版本号
VERSION = 1.0.0
BINNAME = libSKFSwAuth
#编译器
CC = g++
#编译标志位
CFLAGS = -std=c++11 -c -w
#导出指定函数列表
SYM = -Wl,--retain-symbols-file=$(BINNAME).sym -Wl,--version-script=$(BINNAME).map
static = no #static=yes 则编译静态库 这里定义没有用,并不能作为默认值使用,只能外送make static=yes或no
ifeq ($(static), yes)
TARGET := $(BINNAME).a
else
TARGET := $(BINNAME).so
CFLAGS += -fPIC
SHARE := -shared #动态库
endif
debug = no
ifeq ($(debug), yes) #如果debug=yes 则编译debug版本
CFLAGS += -g #编译标志位
TARGET := $(TARGET)_d.$(VERSION) #输出文件名字
DEBUG = -D MYDEBUG #宏定义
TARGET_PATH = Debug/$(VERSION) #程序输出目录
else
CFLAGS += -O3 #编译标志位
TARGET := $(TARGET).$(VERSION) #输出文件名字
TARGET_PATH = Release/$(VERSION) #程序输出目录
endif
#生成文件的md5
TARGET_MD5 = file.md5
#头文件路径
INCLUDES = -I. -I./include -I./include/SKF -I./include/cerceal
#源程序目录
SOURCE_DIR = ./
#库文件目录
LIB_PATH = -L./lib
#库文件名字
LIBS = -lcryptlib64 -liconv ./lib/miracl64.a -ldl -lpthread -lstdc++
#.o输出目录
OBJECTS_PATH = objects
#搜索.c文件,目录深度为1
SOURCE_C = $(shell find $(SOURCE_DIR) -maxdepth 1 -name '*.c')
# 生成需要输出的 .o 文件名
OBJ_1 = $(notdir $(patsubst %.c, %.o, $(SOURCE_C)))
# 加上 .o 文件存放路径前缀
OBJECTS_C = $(foreach file, $(OBJ_1), $(OBJECTS_PATH)/$(file))
#搜索.cpp文件,目录深度为1
SOURCE_CPP = $(shell find $(SOURCE_DIR) -maxdepth 1 -name '*.cpp')
# 生成需要输出的 .o 文件名
OBJ_2 = $(notdir $(patsubst %.cpp, %.o, $(SOURCE_CPP)))
# 加上 .o 文件存放路径前缀
OBJECTS_CPP = $(foreach file, $(OBJ_2), $(OBJECTS_PATH)/$(file))
#SOURCE_C = $(wildcard ./*.c) #获取所有的.c文件
#SOURCE_CPP = $(wildcard ./*.cpp) #获取所有的.cpp文件
#OBJ_C = $(patsubst %.c, %.o, $(SOURCE_C)) #将.c文件转为.o文件
#OBJ_CPP = $(patsubst %.cpp, %.o, $(SOURCE_CPP)) #将.cpp文件转为.o文件
$(TARGET):$(OBJECTS_C) $(OBJECTS_CPP) | $(TARGET_PATH)
@echo "static:"$(static)
ifeq ($(static), yes)
@echo "Build static library......"
$(AR) -rcs $(TARGET) $(OBJECTS_CPP) $(OBJECTS_C)
else
@echo TARGET_MD5:$(TARGET_MD5)
@echo "Build dynamic library...."
$(CC) $(SHARE) -o $(TARGET) $(LIB_PATH) $(LIBS) $(OBJECTS_CPP) $(OBJECTS_C) $(SYM)
endif
cp $(TARGET) $(TARGET_PATH)
md5sum $(TARGET) > $(TARGET_MD5)
cp $(TARGET_MD5) $(TARGET_PATH)
@echo
@echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>SUCCESS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
@echo "outfile:"$(shell pwd)/$(TARGET_PATH)/$(TARGET)
more $(TARGET_MD5)
@echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>SUCCESS<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
@echo
$(OBJECTS_C):$(OBJECTS_PATH)/%.o: %.c | $(OBJECTS_PATH)
@echo SOURCE_C:$(SOURCE_C)
@echo OBJ_1:$(OBJ_1)
@echo OBJECTS_C:$(OBJECTS_C)
$(CC) $(CFLAGS) $(INCLUDES) $(DEBUG) $< -o $@
$(OBJECTS_CPP):$(OBJECTS_PATH)/%.o: %.cpp | $(OBJECTS_PATH)
@echo SOURCE_CPP:$(SOURCE_CPP)
@echo OBJ_2:$(OBJ_2)
@echo OBJECTS_CPP:$(OBJECTS_CPP)
$(CC) $(CFLAGS) $(INCLUDES) $(DEBUG) $< -o $@
#$(OBJ_C):%.o: %.c
# $(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
#$(OBJ_CPP):%.o: %.cpp
# $(CC) $(INCLUDES) $(DEBUG) $(CFLAGS) $< -o $@
$(OBJECTS_PATH):
if [ ! -d $@ ]; then mkdir -p $@; fi #创建一个目录,用于存放已编译的目标
$(TARGET_PATH):
if [ ! -d $@ ]; then mkdir -p $@; fi #创建一个目录,用于存放最终输出文件
.PHONY: clean
clean:
rm -f $(TARGET_MD5)
rm -f $(TARGET)
rm -rf $(OBJECTS_PATH)
可选参数static和debug,可生成deug版本和静态库。
make static=yes debug=yes
(版权所有,转载时请注明作者和出处)