如何快速编写大项目的Makefile文件
在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情。因此,为了帮助程序员高效准确的编写makefile文件,在此提供一套通用的makefile文件编写框架,基于这个框架,使用者只需要相应的填充选项,就可构建好完整的makefile文件。
首先,以一个简单的示例来展示这个makefile文件框架,如下所示:
#生成的二进制文件名 BINOUT := test #依赖的动态库或静态库 LIBS := abc sst llt #头文件路径 INCS := ./ \ ../common/include \ ./include #动态库或静态库文件的相对路径 LIBPATHS := ../../libs \ ../libpaths #编译源程序时所使用的宏 USED_MARCOS := _LINUX_OS_ _UNIT_TEST_ #所使用的编译器 GCC = g++ #编译时的参数配置 CFLAGS = -g -Wall -O2 #编译时所依赖的通用c++源程序 COMMONSRCS=$(wildcard ../common/src/*.cpp ../abc/src/*.cpp) COMMONOBJS=$(patsubst %.cpp,%.o,$(COMMONSRCS)) #源程序文件 SOURCE := $(wildcard ./*.cpp) OBJS := $(patsubst %.cpp,%.o,$(SOURCE)) all:$(BINOUT) $(BINOUT): $(OBJS) $(COMMONOBJS) $(GCC) $(CFLAGS) -o $@ $^ $(addprefix -L,$(LIBPATHS)) $(addprefix -l,$(LIBS)) %.o:%.cpp $(GCC) $(CFLAGS) $(addprefix -D,$(USED_MARCOS)) $(addprefix -I,$(INCS)) -c $< -o $@ clean : rm -rf $(COMMONOBJS) $(OBJS) $(BINOUT)
这个框架的详细说明可参考以上示例中的注释,主要包含依赖库项、头文件路径项及源程序项,其中源程序项可依据你项目的模块分类构建多个变量来保存编译的目标文件,以上示例仅分成通用目标文件(COMMONOBJS)和目标文件(OBJS)。此外,%.o:%.cpp 这一项就是编译所有依赖的源程序文件为.o的目标文件。在以上模板基础上,通过修改相关选项,就可以完成相应的makefile文件编写。
编译静态库文件:
TARGET = libtest.a
all:$(TARGET)
$(TARGET): $(OBJS) $(COMMONOBJS)
rm -f $@
$(AR) rv $@ $^
%.o:%.cpp
$(CC) $(CFLAGS) $(addprefix -D,$(USER_MARCOS)) $(addprefix -I,$(INCS)) -c $< -o $@
编译动态库文件:
TARGET = libtest.so LIBS := INCS := LIBPATHS := USER_MARCOS := POSIX LINUX CFLAGS = -g -Wall -fPIC CC = g++ COMMONSRCS=$(wildcard ../common/*.cpp) COMMONOBJS=$(patsubst %.cpp,%.o,$(COMMONSRCS)) SOURCE := $(wildcard ./*.cpp) OBJS := $(patsubst %.cpp,%.o,$(SOURCE)) all:$(TARGET) $(TARGET): $(OBJS) $(COMMONOBJS) rm -f $@ $(CC) -shared -o $@ $^ %.o:%.cpp $(CC) $(CFLAGS) $(addprefix -D,$(USER_MARCOS)) $(addprefix -I,$(INCS)) -c $< -o $@
一次性编译多个Makefile文件:
all:
make -f Makefile_so clean
make -f Makefile_so all
make -f Makefile_a clean
make -f Makefile_a all
clean:
make -f Makefile_so clean
make -f Makefile_a clean