Linux下通用的Makefile

Linux下通用的Makefile

我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c/.cpp的源文件。如果我们用gcc/g++去一个一个编译每一个源文件的话,效率会低很多,但是如果我们可以写一个Makefile,那么只需要执行一个make就OK了,这样大大提高了开发效率。

但是Makefile的语法规则众多,而且缺乏参考资料,对于初学者来说,写起来还是有一定的难度,往往令很多人望而生畏。下面我们介绍几种比较通用而且简洁的Makefile,大家只要对它稍作修改就可以用在你们自己的工程里了。

刚刚也说过了,Makefile的规则众多,可能出现你们在拷贝的过程中,因为系统不同的缘故会导致在拷贝过程中发生不必要的错误,导致Makefile不可使用,建议最好去github下去clone

github地址

在这里插入图片描述

我一共上传了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
发布了126 篇原创文章 · 获赞 57 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/wolfGuiDao/article/details/104648970
今日推荐