Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Android NDK代码中包含时,包含路径不可见?_Android_C++_Android Ndk_Include Path - Fatal编程技术网

为什么在Android NDK代码中包含时,包含路径不可见?

为什么在Android NDK代码中包含时,包含路径不可见?,android,c++,android-ndk,include-path,Android,C++,Android Ndk,Include Path,我想为我的Android NDK项目添加一个包含路径,但编译器找不到包含的文件。我仔细检查了系统中是否存在包含的文件。我做错了什么 Android.mk: include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_CFLAGS := -Wno-write-strings LOCAL_C_INCLUDES +:= $(LOCAL_PATH) LOCAL_CFLAGS +:= -O3 LOCAL_CPPFLAGS +:=$(LOCAL_CF

我想为我的Android NDK项目添加一个包含路径,但编译器找不到包含的文件。我仔细检查了系统中是否存在包含的文件。我做错了什么

Android.mk:

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_CFLAGS := -Wno-write-strings
LOCAL_C_INCLUDES +:= $(LOCAL_PATH)
LOCAL_CFLAGS +:= -O3 
LOCAL_CPPFLAGS +:=$(LOCAL_CFLAGS)
LOCAL_CFLAGS := -I/absolute/path/to/my/include //--->here the include path is set
LOCAL_SRC_FILES := hello-jni.cpp
LOCAL_LDLIBS := -ldl -llog -lc

include $(BUILD_SHARED_LIBRARY)
jni/hello-jni.cpp中包含的标题:

extern "C" {
#include <codecs/codecs.h>
#include <test/test.h>
#include <mymath/mymath.h>
}
....

尝试在LOCAL_C_INCLUDES中添加标题

我认为问题在于这一行:

LOCAL_CPPFLAGS +:=$(LOCAL_CFLAGS)
这里使用
+:=
意味着使用的本地\u CFLAGS的值是在声明本地\u CPPFLAGS时的值。此时未设置本地\u CFLAGS(在下一行中设置)。尝试将其更改为:

LOCAL_CPPFLAGS +=$(LOCAL_CFLAGS)

这将在每次使用时评估本地CPPU标志,并将选择正确的值。或者,在本地标记中使用本地标记之前,先声明本地标记。

您的Android.mk不遵循基本规则。让我们尝试重写:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE     := hello-jni
LOCAL_CFLAGS     := -Wno-write-strings
ifneq ($(NDK_DEBUG),1)
  LOCAL_CFLAGS   += -O3 
endif
LOCAL_C_INCLUDES := /absolute/path/to/my/include 
LOCAL_SRC_FILES  := hello-jni.cpp
LOCAL_LDLIBS     := -ldl -llog -lc

include $(BUILD_SHARED_LIBRARY)

这假设您有文件
/absolute/path/to/my/include/codecs/codecs.h
等或
/jni/codecs/codecs.h
。如果您的项目也有
jni/test/test.h
jni/mymath/mymath.h
,那么您可能根本不需要定义
本地\u C\u INCLUDES
jni
目录将自动使用

也许可以尝试
ndk build V=1
并查看gcc命令行的实际外观?您确定路径正确吗?无需将
LOCAL\u CFLAGS
复制到
LOCAL\u CPPFLAGS
。NDK对C和C++bu源代码都使用
LOCAL\u CFLAGS
。不要把它们与
LOCAL\u CONLYFLAGS
@AlexCohn混淆好吧,我只是觉得
+:=
看起来很奇怪,这是你在make中很少看到的东西。我直到现在才检查NDK文档。他们说更喜欢
LOCAL\u C\u INCLUDES
而不是
LOCAL\u CFLAGS:=-I.
。唯一的问题是,LOCAL_C_include可能不允许绝对路径,文档不清楚(它们称为“相对于NDK根目录的路径列表”)。但是无论如何,ndk构建系统应该将
CFLAGS
var添加到
CPPFLAGS
,可能使用+:=搞砸了。不,
LOCAL\u C\u INCLUDES
接受绝对路径。它们直接转换为
-Ithis-Ithat
,无需路径操作(不同于
本地\u SRC\u文件
)。而且,LoalAlgCfLAGS对C和C++编译都有影响。有一个特殊的(也是相对较新的)新增的
CONLYFLAGS
,其行为更像GNU make的常见
CFLAGS
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE     := hello-jni
LOCAL_CFLAGS     := -Wno-write-strings
ifneq ($(NDK_DEBUG),1)
  LOCAL_CFLAGS   += -O3 
endif
LOCAL_C_INCLUDES := /absolute/path/to/my/include 
LOCAL_SRC_FILES  := hello-jni.cpp
LOCAL_LDLIBS     := -ldl -llog -lc

include $(BUILD_SHARED_LIBRARY)