makefile处理多级目录

https://blog.csdn.net/gaoxing01/article/details/41146789

问题描述:

如果一个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);
}

(0)

相关推荐