makefile处理多级目录

问题描述:

如果一个project有多级目录,Makefile改如何编写。

作为练习,c project有如下要求

1. 目录结构

------src

----------main.c

-----------add

----------------add.h

----------------add.c

-----------minus

--------------------minus.h

--------------------minus.c

-----------obj

2. main.c 依赖add.h 和minus.h

3. .o文件全部放入obj目录下


解决方案:

makefile 如下

     1  VPATH := .:./add:./minus:./obj
     2  DIR = $(PWD)
     3  source := $(shell find $(PWD) -name '*.c' |xargs -n1 basename)
     4  header := $(shell find $(PWD) -name '*.h' |xargs -n1 dirname)
     5  INCLUDE += $(foreach item,$(header), -I $(item));
     6  obj := $(source:.c=.o)
     7  objs :=  $(foreach i,$(obj),obj/$(i))
     8
     9  all : $(objs)
    10          gcc -o all $(objs) $(INCLUDE)
    11
    12  $(objs) : obj/%.o : %.c
    13          gcc -c $(<) -o $@ $(INCLUDE)
    14  clean :
    15          rm -rf obj/*.o all

思路如下:

定义VPATH使makefile能够找到对应文件

获取source file 

获取需要include 的头文件目录

主要难点是line 12, 匹配模式后如何实现.o和.c的转换


测试结果:

[root@localhost src]# ls
add  all  main.c  makefile  minus  obj



[root@localhost src]# make clean all
rm -rf obj/*.o all
gcc -c ./add/add.c -o obj/add.o  -I /home/ainet/test/src/add  -I /home/ainet/test/src/minus;
gcc -c ./minus/minus.c -o obj/minus.o  -I /home/ainet/test/src/add  -I /home/ainet/test/src/minus;
gcc -c main.c -o obj/main.o  -I /home/ainet/test/src/add  -I /home/ainet/test/src/minus;
gcc -o all obj/add.o obj/minus.o obj/main.o  -I /home/ainet/test/src/add  -I /home/ainet/test/src/minus;
[root@localhost src]# ./all
8 + 4 = 12
7 - 9 = -2


main.c

     1  #include <stdio.h>
     2  #include "add/add.h"
     3  #include "minus/minus.h"
     4
     5  int main(int argc, char *argv[])
     6  {
     7          printf("%d + %d = %d\n",8, 4, add(8,4));
     8          printf("%d - %d = %d\n",7, 9, minus(7,9));
     9
    10          return 0;
    11  }

add.h

int add(int x, int y);

add.c

int add(int x, int y)
{
        return (x+y);
}


minus.h

int minus(int x, int y);


minus.c

int minus(int x, int y)
{
        return (x - y);
}










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值