首先假如你拥有一个如许结构的目录(当然,如果知道这个结构如何编写,那么其他的也就很容易了,类比类比就搞定)
Makefile target (生成目标) src/ (源代码目录) main.cpp (程序main程序) obj/ (目标文件目录)
lib/ (静态库和动态库目录)
其中Makefile是我们需要编写的能够自动推导编译的Makefile文件,target是目标生成目录,src是源代码,出来main.cpp以为还有其他的很多源文件,obj是我们需要放编译的.o的文件,lib文件夹是存放编译好的.a或者是so文件的目录。
那么如何编译一个Makefile能够自动的推导编译生成我们需要的东西呢?看看下面的Makefile
STATICLIB=test_lib.a
SHARELIB=test_lib.so
LIB:=lib
MAIN:=main
######################################
VPATH=src
OBJDIR = obj
Target:=target
SRCPATH:= $(filter-out src/main.cpp,$(foreach dir,$(VPATH),$(wildcard $(addprefix ${dir}/*,.cpp))))
OBJS:= $(subst src,obj,$(subst .cpp,.o,$(SRCPATH)))
all:$(MAIN)
$(MAIN): src/main.cpp $(STATICLIB)
@test -d $(Target) | mkdir -p $(Target)
g++ -o $@ src/main.cpp $(LIB)/$(STATICLIB)
@mv $(MAIN) $(Target)/
$(OBJS):$(SRCPATH)
@test -d $(OBJDIR) | mkdir -p $(OBJDIR)
g++ -c $(SRCPATH)
@mv *.o $(OBJDIR)/
$(STATICLIB):$(OBJS)
@test -d $(LIB) | mkdir -p $(LIB)
ar -q $@ $<
@mv $@ $(LIB)/
$(SHARELIB):$(SRCPATH)
@test -d $(LIB) | mkdir -p $(LIB)
g++ $< -shared -fPIC -o $@
@mv $(SHARELIB) $(LIB)/
clean:
rm $(OBJDIR) -rf
rm $(LIB) -rf
rm $(Target) -rf
~
从上面的代码可以出来,其实很简单,自己考吧去体验一下吧?
欢迎大家使用wi输入法
浙公网安备 33010602011771号