【问题标题】:Why are include paths unseen when #include in Android NDK code?为什么在 Android NDK 代码中 #include 时看不到包含路径?
【发布时间】:2014-09-28 10:11:54
【问题描述】:

我想为我的 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>
}
....

错误日志:

jni/hello-jni.cpp:9:34: fatal error: codecs/codecs.h: No such file or directory
compilation terminated.
make: *** [obj/local/armeabi/objs/hello-jni/hello-jni.o] Error 1

【问题讨论】:

  • 也许试试ndk build V=1 看看gcc 命令行实际上是什么样子的?你确定你有正确的路径吗?

标签: android c++ android-ndk include-path


【解决方案1】:

尝试在 LOCAL_C_INCLUDES 中添加标题

【讨论】:

    【解决方案2】:

    我认为问题出在这一行:

    LOCAL_CPPFLAGS +:=$(LOCAL_CFLAGS)
    

    这里使用+:=表示使用的LOCAL_CFLAGS的值是声明LOCAL_CPPFLAGS时的值。此时 LOCAL_CFLAGS 尚未设置(在下一行设置)。尝试将其更改为:

    LOCAL_CPPFLAGS +=$(LOCAL_CFLAGS)
    

    这将在每次使用时评估 LOCAL_CPPFLAGS 并获取正确的值。或者,在 LOCAL_CPPFLAGS 中使用之前声明 LOCAL_CFLAGS。

    【讨论】:

    • 无需将LOCAL_CFLAGS复制到LOCAL_CPPFLAGS。 NDK 对 C 和 C++bu 源都使用 LOCAL_CFLAGS。不要将它们与LOCAL_CONLYFLAGS 混淆。
    • @AlexCohn 好吧,我只是觉得+:= 看起来很奇怪,这是你在 make 中很少看到的东西。直到现在我才检查 NDK 文档。他们说喜欢LOCAL_C_INCLUDES 而不是LOCAL_CFLAGS := -I...。唯一的问题是 LOCAL_C_INCLUDES 可能不允许绝对路径,文档不清楚(他们说“相对于 NDK 根目录的路径列表”)。但是 CFLAGS var 无论如何都应该由 ndk 构建系统添加到 CPPFLAGS,也许使用 +:= 搞砸了。
    • LOCAL_C_INCLUDES 可以完美地接受绝对路径。它们直接翻译成-Ithis -Ithat,无需路径操作(与LOCAL_SRC_FILES 不同)。而no,LOCAL_CFLAGS 会影响 C 和 C++ 编译。 CONLYFLAGS 有一个特殊的(也是相对较新的)添加,其行为更像是 GNU make 的常用 CFLAGS
    【解决方案3】:

    您的 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 等或 &lt;project&gt;/jni/codecs/codecs.h。如果您的项目还有jni/test/test.hjni/mymath/mymath.h,您可能根本不需要定义LOCAL_C_INCLUDESjni 目录将被自动使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多