前面写了“写Makefile(二)”,现在对前面的Makefile作一个改进。
现在源文件有三个,分别是:main.cpp,tdes.c和tdes.h,Makefile内容如下:
CC=aCC DEFS=-AA -g INCLUDES= -I. LINKFLAGS=$(DEFS) LIBS= TARGET=main DEFINES= $(DEFS) $(INCLUDES) CFLAGS= $(DEFINES) OBJS=main.o tdes.o all:$(TARGET) .cpp.o: rm -f $@ $(CC) $(CFLAGS) -c $*.cpp .c.o: rm -f $@ $(CC) $(CFLAGS) -c $*.c $(TARGET):$(OBJS) $(CC) $(LINKFLAGS) -o $(TARGET) $(OBJS) $(LIBS) clean: rm -rf $(OBJS) rm -rf $(TARGET)
看到了吗,现在没有对每个.o文件单独写一个依赖规则,今后几十增加更多的.c和.cpp文件,只需要在OBJS文件后面添加一个.o文件的名字就可以了。
上面的办法已经比较简便了,但是还有人嫌编辑那么多.o名字麻烦,那么还有一个办法,Makefile更改如下:
CC=aCC DEFS=-AA -g INCLUDES= -I. LINKFLAGS=$(DEFS) LIBS= TARGET=main DEFINES= $(DEFS) $(INCLUDES) CFLAGS= $(DEFINES) OBJS=$(patsubst %.c,%.o,$(wildcard *.c)) $(patsubst %.cpp,%.o,$(wildcard *.cpp)) all:$(TARGET) .cpp.o: rm -f $@ $(CC) $(CFLAGS) -c $*.cpp .c.o: rm -f $@ $(CC) $(CFLAGS) -c $*.c $(TARGET):$(OBJS) $(CC) $(LINKFLAGS) -o $(TARGET) $(OBJS) $(LIBS) clean: rm -rf $(OBJS) rm -rf $(TARGET)
上面通过$(patsubst %.c,%.o,$(wildcard *.c)) 和$(patsubst %.cpp,%.o,$(wildcard *.cpp),将目录下.c和.cpp文件名字全部转化成.o文件列表,并赋予变量OBJS值。
但是这样有一个缺点,这样会把目录下的所有源文件都编译进来,有些文件可能你不希望编译的,可能会引起不必要的错误。
可以根据自己的需要选择。