如何配置make文件以查找其他目录中的头文件?

时间:2015-04-03 15:07:35

标签: android-ndk makefile

我一直从Android.mk文件中收到此错误:

/home/sansari/mytree2/tbt/app/app.c:23:19: fatal error: debug.h: No such file or directory
 #include <debug.h>

我要做的是将源从另一个目录导入我的jni项目。所以我甚至没有任何关于构建app.c的声明;它是通过制定隐含规则来完成的。惠斯特很棒。我的问题似乎是不知道如何告诉make嘿看看./include目录中的debug.h。那将是/ home / sansari / mytree2 / tbt / include。我该怎么办?您还需要哪些其他信息来帮助我?

为了提供一个参考点,我需要添加我试图运行make:

/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni

我确实发出了-p选项来制作;实际上我正在运行ndk-build命令,这是一个运行make的shell。似乎make在我的sources目录中处理.mk fiels。如果没有为其他make文件添加include,make是否可以隐式执行此操作?这是我创建源文件所做的工作;看起来make会自动在这些目录中找到.mk文件并运行它们:

FILE_LIST := $(wildcard /home/sansari/mytree2/tbt/*.c)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/*.c)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/*.c)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/*.c)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/*.c)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/**/*.c)
LOCAL_MODULE    := HelloJNI
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) HelloJNI.c

关于这个问题的最新消息;我发现VPATH语句可以正常工作,并且实际上找到了该文件。但是编译器可能看不到它。我仍在阅读和挖掘,但如果有人可以提供帮助,我一定会感激。

@ognian - 嘿谢谢。我尝试了你的建议,似乎没有解决我的问题。我打印了LOCAL_C_FLAGS的内容只是为了验证。这就是我所拥有的:

/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/jni/Android.mk:15: value of LOCAL_CFLAGS  -I/home/sansari/mytree2/lib/include/debug.h
[arm64-v8a] Compile        : HelloJNI <= app.c
/home/sansari/mytree2/tbt/app/app.c:23:19: fatal error: debug.h: No such file or directory
 #include <debug.h>
                   ^
compilation terminated.
make: *** [/home/sansari/AndroidStudioProjects/ThirdNDK/app/src/main/obj/local/arm64-v8a/objs/HelloJNI//home/sansari/mytree2/tbt/app/app.o] Erro
r 1

从我在网上看到的,在我看来,我可以指向正确的目录,但我不知道还有什么需要发生才能看到它。网上还有一些关于编译器没有看到所需文件的可能性的评论。我想我需要更多地了解在使用正确的路径加载变量后会发生什么。我查看了vpath和VPATH,但根据make manual,路径的目录部分被make删除。所以我尝试创建一个变量并将所有头文件的路径加载到其中。然后我将内容复制到GPATH变量中,根据手册,它不会删除目录路径。但我想我不知道还需要做什么。这是我的Androdi.mk

LOCAL_PATH := $(call my-dir)
#.INCLUDE_DIRS=make arch
#TLK_DIR = ../../../../../..$(LOCAL_PATH)/mytree2/tbt
include $(CLEAR_VARS)
#-I.$(LOCAL_PATH)../../../../../../mytree2/tbt/include/ \
SOURCES = /home/sansari/mytree2/tbt/%.c
#$(warning value of SOURCES is $(SOURCES))

INCLUDE_DIRECTORIES = /home/sansari/mytree2/lib/include

vpath %.h $(INCLUDE_DIRECTORIES) 
CFLAGS += $(addprefix -I ,$(INCLUDE_DIRECTORIES)) 
#$(warning value of CFLAGS is $(CFLAGS))
LOCAL_CFLAGS += -I/home/sansari/mytree2/lib/include/debug.h
$(warning value of LOCAL_CFLAGS $(LOCAL_CFLAGS))
#override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
HEATHER_LIST := $(wildcard /home/sansari/mytree2/tbt/*.h)
FILE_LIST := $(wildcard /home/sansari/mytree2/tbt/*.c)
#$(warning value of HEATHER_LIST is $(HEATHER_LIST))
#$(warning value of FILE_LIST is $(FILE_LIST))
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/*.c)
HEATHER_LIST += $(wildcard /home/sansari/mytree2/tbt/**/*.h)
#$(warning value of FILE_LIST is $(FILE_LIST))
#$(warning value of HEATHER_LIST is $(HEATHER_LIST))
#FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/*.h)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/*.c)
HEATHER_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/*.h)
#$(warning value of HEATHER_LIST is $(HEATHER_LIST))
#$(warning value of FILE_LIST is $(FILE_LIST))
#FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/*.h)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/*.c)
HEATHER_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/*.h)
#$(warning value of FILE_LIST is $(FILE_LIST))
#$(warning value of HEATHER_LIST is $(HEATHER_LIST))
#FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/*.h)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/*.c)
HEATHER_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/*.h)
#$(warning value of HEATHER_LIST is $(HEATHER_LIST))
#$( warning value of FILE_LIST is $(FILE_LIST))
#FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/*.h)
FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/**/*.c)
HEATHER_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/**/*.h)
#$( warning value of FILE_LIST is $(FILE_LIST))
#$(warning value of HEATHER_LIST is $(HEATHER_LIST))
GPATH = $(HEATHER_LIST)
#$(warning ******The Value of GPATH is $(GPATH))
#FILE_LIST += $(wildcard /home/sansari/mytree2/tbt/**/**/**/**/**/*.h)
LOCAL_MODULE    := HelloJNI
LOCAL_C_INCLUDES := $(LOCAL_PATH)/HEATHER_LIST
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) HelloJNI.c
# Build all java files in the java subdirectory
#LOCAL_MODULE    := HelloJNI
#LOCAL_SRC_FILES := HelloJNI.c
# Tell it to build an APK
include $(BUILD_SHARED_LIBRARY)
#include $(TLK_DIR)/makefile 

1 个答案:

答案 0 :(得分:0)

您需要提供标题查找选项:

LOCAL_CFLAGS + = -I {your-header-path-here}