【问题标题】:Eclipse-CDT fails to find stdlib symbols in NDK projectEclipse-CDT 在 NDK 项目中找不到 stdlib 符号
【发布时间】:2012-01-30 23:55:56
【问题描述】:

我正在尝试使用 NDK 和 C++ 编写一个简单的 Android 应用程序。具体来说,我想使用最新版本的 NDK (r7) 中包含的 gnustdc++。 JNI 库已经像 C 一样编译并运行得非常好,但是现在我尝试引入 C++,我遇到了一些问题。

我已将${NDK_ROOT}/sources/cxx-stl/gnu-libstdc++/include/ 添加到我的项目的包含路径中,并且#includes 内联已解决。但是,尝试实际使用任何 STL 类(例如 vector)会导致 Symbol 'vector' could not be resolved

<stdlib.h> 导入的所有标准 C 符号都可以正常工作,直到我尝试用 <cstdlib> 替换 #include。然后它以Function 'malloc' could not be resolved 失败,依此类推。

奇怪的是,添加 stlport 标头(在 ${NDK_ROOT}/sources/cxx-stl/stlport/stlport 中)解决了我的所有问题。但是我在 GNU C++ 中链接,而不是 STLPort,所以这充其量是一个不方便和不恰当的“解决方案”。这些标头可以工作但其他标头不起作用,这似乎很奇怪。 Eclipse 是否无法索引或解析 GNU C++ 标头?

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libfoobar-jni
LOCAL_SRC_FILES := foobar.cpp
LOCAL_LDLIBS := -llog -lGLESv2

LOCAL_C_INCLUDES := sources/cxx-stl/gnu-libstdc++/include/
LOCAL_CFLAGS := -g -std=c99

include $(BUILD_SHARED_LIBRARY)

应用程序.mk

APP_STL := gnustl_shared

编辑:我根据以下内容设置我的项目:

http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/

【问题讨论】:

    标签: android c++ eclipse android-ndk eclipse-cdt


    【解决方案1】:

    阅读这里,它有解决方案:

    http://comments.gmane.org/gmane.comp.handhelds.android.ndk/14371

    总结一下,万一有一天链接失效了:

    这是 gnustl_shared 模块声明中的一个错误。很抱歉,它将在下一个版本中修复。 同时,您可以手动更改$NDK/sources/cxx-stl/gnu-libstdc++/Android.mk 并替换以下行:

    LOCAL_EXPORT_LDLIBS := $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libsupc++.a
    

    与:

    LOCAL_EXPORT_LDLIBS := $(call host-path,$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libsupc++.a)
    

    【讨论】:

    • 我会尽快确认,然后接受您的解决方案。非常感谢!
    • 确认我在 NDK-r8 中遇到了这个问题,但确认此路径已添加到最新版本中的 make 中。
    【解决方案2】:

    我知道这不是一个完美的解决方案,但至少它会让你通过 Eclipse 点击“运行”或“调试”:

    • 右键单击您的 Android C++ 项目并选择属性。
    • 在 C/C++ 常规下,点击“代码分析”
    • 切换到“使用项目设置”
    • 将由于使用矢量类而收到的任何错误切换为“警告”。

    对我来说,到目前为止我需要切换的错误是:

    • “符号未解析”
    • “未找到成员声明”
    • “无效的模板参数”
    • “无效参数”
    • “方法无法解析”

    就像我说的,它并不完美,因此您可能会错过真正的错误,但您仍然可以选择“转到声明”和一些语法检查功能,以及启动程序的功能。 ndk-build 步骤无论如何都会捕捉到任何真正的错误,所以这真的不是一个巨大的损失。 老实说,我不确定这个问题的根源。这很可能是一个 Eclipse 错误。

    离题但相关:您也可以通过 Eclipse 使用 ndk-gdb。该教程在链接到OP的博客上,但here's a direct link anyway

    祝你好运!


    编辑(跟进):

    我已经找到了解决这个问题的方法,至少在我的盒子上是这样。 OP 说包括 STLPORT 标头对他有用。起初它不适合我。我不得不销毁我的 Eclipse 项目并重新开始(出于某种原因,它不允许我删除一些包含定义)。添加 STLPORT 修复了一些问题,但在 ndk r7b 中,我仍然遇到奇怪的错误(例如,即使在包含 stddef 之后也没有定义 NULL)。我最终也不得不包含 x86 标头。这些应该在很大程度上与手臂重叠,但是,在包含顺序中将手臂放在“顶部”很有用。

    所以,如果你遇到了和我一样的问题,请添加


    $NDK_DIR/platforms/android-14/arch-x86/usr/include


    您的 Eclipse 列表也包括在内。

    【讨论】:

      【解决方案3】:

      由于 cygwin 中的不同路径格式,我在 windows 上遇到了这个问题,我喜欢的 windows shell 使用伪 unix 样式路径而不是 windows。如果您遇到此问题,并且您的路径中有 cygwin,则 eclipse 可能正在使用它。将 Properties>C General>Paths and Symbols 中的路径更改为 cygwin 样式而不是 windows 样式(/cygwin/c/Android....而不是 C:\Android...)...无论如何,这对我有用.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 2015-06-15
        • 2013-05-27
        • 2012-03-24
        • 1970-01-01
        相关资源
        最近更新 更多