Linux下通用的Makefile
我们在Linux环境下开发程序,少不了要自己编写Makefile
,一个稍微大一些的工程下面都会包含很多.c/.cpp的源文件。如果我们用gcc/g++去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这样大大提高了开发效率。
但是Makefile的语法规则众多
,而且缺乏参考资料,对于初学者来说,写起来还是有一定的难度,往往令很多人望而生畏。下面我们介绍几种比较通用而且简洁的Makefile,大家只要对它稍作修改
就可以用在你们自己的工程里了。
刚刚也说过了,Makefile的规则众多,可能出现你们在拷贝的过程中,因为系统不同的缘故会导致在拷贝过程中发生不必要的错误
,导致Makefile不可使用,建议最好去github下去clone
我一共上传了4种通用的makefile,自己用的是MyMakefile,各有优缺点,大家请便!!!
这里贴一下MyMakefile:
################################################################
###################支持C/C++混合编译############################
################################################################
PRJ_ROOT= #一般不用更改,这里可以添加头文件的路径等,接在LDFLAGS后面,方便使用
CC=g++ #编译器,编译C文件选择gcc,编译C++文件选着g++(最好选g++,因为其兼容C)
CFLAGS= #如果需要调试,在这里增加-g选项,还可以根据自己的需要添加响应的选项命令
CPPFLAGS= #同上
LDFLAGS=-std=c++11 -lpthread
################################################################
###########源文件,每增加一个目标,依样增加下面一段#############
################################################################
#源文件列表1
i:=1
SOURCES_CPP_$(i):=test.cpp #在这里添加、修改当前目标需要的CPP源码
SOURCES_C_$(i):= #在这里添加、修改当前目标需要的C源码
TARGET_$(i):=testcpp #目标名称
OBJS_CPP_$(i):=$(patsubst %.cpp,%.o, $(SOURCES_CPP_$(i)))
OBJS_C_$(i):= $(patsubst %.c,%.o, $(SOURCES_C_$(i)))
OBJS_$(i):= $(OBJS_CPP_$(i)) $(OBJS_C_$(i))
#源文件列表2
i:=2
SOURCES_CPP_$(i):=
SOURCES_C_$(i):=main.c
TARGET_$(i):=mainc
OBJS_CPP_$(i):=$(patsubst %.cpp,%.o, $(SOURCES_CPP_$(i)))
OBJS_C_$(i):= $(patsubst %.c,%.o, $(SOURCES_C_$(i)))
OBJS_$(i):= $(OBJS_CPP_$(i)) $(OBJS_C_$(i))
################################################################
#######目标和清除 每增加一个目标,依样增加一个target############
################################################################
all: $(TARGET_1) $(TARGET_2)
@echo "outputfile : $(TARGET_1) $(TARGET_2)"
clean:
rm -f *.o *.d $(TARGET_1) $(TARGET_2)
################################################################
##########目标, 每增加一个目标,依样增加下面一段###############
################################################################
#目标1
$(TARGET_1):$(OBJS_1)
$(CC) $(OBJS_1) $(LDFLAGS) -o $(TARGET_1)
#目标2
$(TARGET_2):$(OBJS_2)
$(CC) $(OBJS_2) $(LDFLAGS) -o $(TARGET_2)
################################################################
###########包含 每增加一个目标,依样增加下面一行################
################################################################
sinclude $(OBJS_1:.o=.d)
sinclude $(OBJS_2:.o=.d)
############################################################
#################下面的内容可以不用更改#####################
############################################################
#下面这边都是获取依赖关系 ,属于约定俗成的写法,不用更改
%.d: %.c
@rm -f $@;
@$(CC) -MM $< > $@.1111; \
sed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.1111 > $@; \
rm -f $@.1111
%.d: %.cpp
@rm -f $@;
@$(CC) -MM $< > $@.1111; \
sed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.1111 > $@; \
rm -f $@.1111