需求
文件结构如下
Makefile
dir1下有main.c func.c build.sh
dir2下有main.c func.cc build.sh
dir3下有main.c func.cpp build.sh
要求dir1和dir2下将所有文件链接为一个可执行文件,dir3下每个源文件都要编译成一个可执行文件
即编译后文件结构为
Makefile
dir1:main.c func.c build.sh a.out
dir2:main.c func.cc build.sh a.out
dir1:main.c func.cpp build.sh main func
Makefile实现
flag=0 #flag由build.sh传入,直接覆盖
ifeq ($(flag),0)
DIR=./dir1
endif
ifeq ($(flag),1)
DIR=./dir2
endif
ifeq ($(flag),2)
DIR=./dir3
endif
TARGET=$(DIR)/main.exe
C_SRC=$(wildcard $(DIR)/*.c)
CC_SRC=$(wildcard $(DIR)/*.cc)
CPP_SRC=$(wildcard $(DIR)/*.cpp)
OBJ_C=$(patsubst %.c,%.o,$(C_SRC))
OBJ_CPP=$(patsubst %.cpp,%.o,$(CPP_SRC))
OBJ_CC=$(patsubst %.cc,%.o,$(CC_SRC))
OBJS=$(OBJ_C) $(OBJ_CC) $(OBJ_CPP)
CC=g++
ifeq ($(flag),2) #flag=2对应dir3
TARGETS=$(OBJS:%.o=%)
all:$(TARGETS)
@for i in $(TARGETS);do \
$(CXX) -o $${i} $${i}.c*;done
.PHONY:clean
clean:
rm $(TARGETS)
else
$(TARGET):$(OBJS)
$(CXX) $^ -o $@
.PHONY:clean
clean:
-rm $(TARGET) $(OBJS)
endif
build.sh(以dir1下实现为例)
#编译
cd ..
make flag=0
#执行
cd dir1
./main.exe
#删除
cd ..
make clean flag=0
cd dir1
pwd