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);
}