makefile示例

给大家分享我写的两个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

(版权所有,转载时请注明作者和出处)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

离水的鱼儿

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值