makefile 多级目录如何编写

第一种方法:你可以在子目录中编写出第二个makefile文件,它的作用是编译该子目录下的源

文件,并将它们保存到一个函数库中,然后将该库文件复制到上一级的主目录中。在主目录中的

makefile文件包含一条用于制作函数库的规则,该规则会调用第二个makefile文件,如下所示


mylib.a:

(cd mylibdirectory;$(MAKE))

第二种方法是,在原来的makefile文件中添加一些宏。新添加的宏通过在我们已见过的宏的尾部

追加一个字母得到,字母D代表目录,字母F代表文件名。然后你就可以用下面的规则来替换内置的.c.o

后缀规则:

        .c.o:

        $(CC)  $(CFLAGS)  -c   $(@D)/$(<F)    -o    $(@D)/$(@F)

         这条规则的作用是:编译子目录中的源文件并将目标文件放在该子目录中。然后,你用如下的依赖关系

和规则来更新当前目录下的函数库:

       mylib.a:   mydir/2.o  mydir/3.o

        ar  -rv   mylib.a   $?  


第一种方法示例:


当前目录./Makefile_multi_dir

子目录:./mylib/makefile


当前目录./Makefile_multi_dir 文件内容

all: myapp mylib.a


#Which compiler
CC=gcc

#Where to install
INSTDIR=/usr/local/bin

#Where are include files kept
INCLUDE=.

#Options for development
CFLAGS=-g -Wall -ansi

#Options for release
#CFLAGS=-O -Wall -ansi

#Local Libraries
MYLIB=mylib.a

MAKE=make all
#.cqq.o:
%.cqq:%o
        $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c  $<

myapp: main.o $(MYLIB)
        $(CC) -o myapp main.o $(MYLIB)
mylib.a:

        cd mylib;$(MAKE);mv ./mylib.a ../mylib.a;


main.o: main.cqq a.h

clean:
        -rm main.o 2.o 3.o $(MYLIB) myapp
install: myapp
        @if [ -d $(INSTDIR) ]; then \
        cp myapp $(INSTDIR) && \
        chmod a+x $(INSTDIR)/myapp && \
        chmod og-w $(INSTDIR)/myapp && \
        echo "Installed in $(INSTDIR)"; \
        else \
            echo "Sorry, $(INSTDIR) does not exist"; false; \
        fi

子目录:./mylib/makefile   文件内容

all: mylib.a


MYLIB=mylib.a


#Where are include files kept
INCLUDE=.


#Options for development
CFLAGS=-g -Wall -ansi


#.cqq.o:
%.cqq:%o
        $(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c  $<
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
2.o: 2.cqq a.h b.h
#       $(CC) -c 2.cqq
3.o: 3.cqq b.h c.h
#       $(CC) -c 3.cqq


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值