在编写makefile的过程中遇到了这样的一个问题,问题的简单介绍如下:
SERVICE_DIR=$(PWD)/service/
SERVICE_TARGET=scan
INCLUDE=-I$(PWD)/dir1
INCLUDE+=-I$(PWD)/dir2
INCLUDE+=-I$(PWD)/dir3
service:$(SERVICE_OBJS)
make -C $(SERVICE_DIR) INCLUDE=$(INCLUDE) TARGET=$(SERVICE_TARGET)
上面是截取的makefile的一个片段,目的是在顶层的makefile中调用service目录的makefile,进而生成一个service程序,但是在真正编译的提示却提示错误,错误是在编译service中的某个.c文件时提示dir3中的一个头文件找不到,这个.c文件包含了dir3中的这个头文件。
$INCLUDE变量包含了这三个头文件目录了,为什么还提示找不到呢,我看makefile在执行的过程是,在make -C这一行INCLUDE替换后是包含了三个头文件目录,但是进入service目录以后编译service目录中的程序时却只包含了dir1目录,为什么会这样呢?
最后发现了问题,$(INCLUDE)进入到service目录以后service中的makefile只识别了其中的第一个dir1目录,把剩余的两个目录全部丢弃掉了,进而只看到使用了第一个目录,修改方法是将INCLUDE=$(INCLUDE)修改为INCLUDE="$(INCLUDE)",这样,service中的makefile就会把$(INCLUDE)当做一个整体处理,添加完""之后再进行编译就成功编译通过了。