1,主Makefile,Makefile所在的目錄只有main.cpp main2.cpp,及要把生成的.o文件放到./obj目錄下
SOURCES = $(filter-out main2.cpp,$(wildcard *.cpp)) #make test:make -n #如果還有其他目錄下的文件,可以使用下面的方法進行添加 #SOURCES += $(wildcard ../src/*.cpp) #c/c++預定義變量 #AR=ar #CXX=g++ #CC=cc #AS=as #CPP=$(CC) -E,C程序的預編譯處理器 #CFLAGS #ASFLAGS #ARFLAGS=rv #CXXFLAGS #CPPFLAGS #LDFLAGS OBJDIR = obj/ #相當於$(patsubst %.cpp,%.o,$(filter-out main2.cpp,$(wildcard *.cpp))) #相當於$(patsubst %.cpp,%.o,$(SOURCES)) OBJS = $(SOURCES:.cpp=.o) TARGET = h.out all:$(TARGET) #注意在OBJS前面不要加上OBJDIR $(TARGET):$(OBJS) #在TARGET中運行shell及多行寫法 if [ ! -d $(OBJDIR) ]; then \ mkdir $(OBJDIR) ;\ fi echo $(OBJDIR) echo $(HOME) $(MAKE) -C test2 g++ $(OBJDIR)$^ -o $@ $(filter-out main2.o,%.o):%.cpp if [ ! -d $(OBJDIR) ]; then \ mkdir $(OBJDIR) ;\ fi echo $(OBJDIR) g++ -fPIC -c $< -o $(OBJDIR)$@ #test : make clean -n clean: $(MAKE) clean -C test2 -rm $(OBJDIR)$(OBJS) -rm $(TARGET)
2,從Makefile,生成的.o文件也要放到主Makefile所在的目錄下的obj目錄,.cpp文件:testRead.cpp,testWrite.cpp
SOURCES = $(wildcard *.cpp) #相當於$(patsubst %.cpp,%.o,$(wildcard *.cpp)) #相當於$(patsubst %.cpp,%.o,$(SOURCES)) OBJS = $(SOURCES:.cpp=.o) OBJDIR = ../obj/ TARGETDIR = ./ TARGETS = Read Write all:Read Write Read:$(filter %Read.o,$(OBJS)) echo $(OBJS) g++ $(OBJDIR)$^ -o $(TARGETDIR)$@ Write:$(filter %Write.o,$(OBJS)) echo $(OBJS) g++ $(OBJDIR)$< -o $(TARGETDIR)$@ #相當於OBJS $(OBJS):%.o:%.cpp g++ -fPIC -c $< -o $(OBJDIR)$@ clean: -rm $(addprefix $(OBJDIR),$(OBJS)) -rm $(addprefix $(TARGETDIR),$(TARGETS))