Makefile实例

现在来编写下面目录结构的Makefile:
其中client_app和server_app是最终的编译结果,my.db是数据库运行过程中产生的。

  • 顶层目录的Makefile:
//顶层目录的Makefile应该是把握整个工程的编译路线的。内容如下:
CFLAGS=-DDEBUG  -Iinclude  -I../include
export  CFLAGS
all:
    make -C client
    make -C server
    make -C rawlist
    make -C userlist
    make -C mydatabase
    make -C obj
.PHONY:clean
clean:
    rm obj/*.o ./*_app
//分析:首先可将Makefile分为变量定义和命令执行两部份;在变量定义中,我们将编译选项CFLAGS这个变量确定,然后用“export  CFLAGS”将其导出,以方便我们调用的子目录的Makefile利用。“-DDBUG”是定义宏开关,“-Iinclude”是指定头文件的路径,这个是给顶层的Makefile使用的,“-I../include”同样是定义头文件的路径,但是这是给子目录中的Makefile用的。变量定义部分完成之后就开始写命令执行这一部分了,“all”是没有依赖,所以下面的命令走一次。工作很简单,就是进入各个子目录中将其中的“.c”文件编译成obj目录下的“.o”文件。
  1. client子目录Makefile:
//client子目录中就只有两个文件:client.c和Makefile
../obj/client.o:client.c
    gcc  -c $(CFLAGS)  -o  $@   $^
//$(CFLAGS)这个变量是我们在顶层目录中的Makefile中已经定义过的,并且利用export导出了,而这里的Makefile又是顶层目录的Makefile所调用的,所以我们在这里直接用即可。注意要加“-c”选项,因为这只是“预处理+编译+汇编”阶段,生成的目标是上一级obj目录中的“.o”文件。
  • server子目中Makefile:
all:
../obj/server.o:server.c
    gcc -c $(CFLAGS) -o $@ $^
  • rawlist子目录Makefile:
../obj/rawlist.o:server.c
    gcc -c $(CFLAGS) -o $@ $^
  • userlist子目录Makefile:
../obj/userlist.o:userlist.c
    gcc -c $(CFLAGS) -o $@  $^
  • mydatabase子目录Makefile:
../obj/mydatabase.o:mydatabase.c
    gcc -c $(CFLAGS) -o  $@  $^
  • obj子目录中的Makefile:
all:../client_app  ../server_app
../client_app:client.o 
    gcc  -o  $@  $^
../server_app:server.o
    gcc  -o  $@  $^
//obj子目录中的Makefile是用作最后的连接作用,分别在顶层目录中生成client_app和server_app。此时就不必加“-c“选项了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值