charlezou

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

首先假如你拥有一个如许结构的目录(当然,如果知道这个结构如何编写,那么其他的也就很容易了,类比类比就搞定)

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
~                   

 从上面的代码可以出来,其实很简单,自己考吧去体验一下吧?

欢迎访问:http://wi.hit.edu.cn/im

欢迎大家使用wi输入法

posted on 2013-04-02 23:19  charlezou  阅读(1249)  评论(0)    收藏  举报