【问题标题】:smart pointers not working with Android NDK r8智能指针不适用于 Android NDK r8
【发布时间】:2013-01-10 00:31:39
【问题描述】:

我不知道如何在我的 Android 项目中使用共享指针。我在带有 Android NDK r8d 的 Mac OS X 上使用最新的 Eclipse ADT。

这是我的Android.mk 文件中的内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CPPFLAGS  := -std=c++11
LOCAL_MODULE    := native
LOCAL_SRC_FILES := native.cpp
include $(BUILD_SHARED_LIBRARY)

这是我的Application.mk 文件中的内容:

NDK_TOOLCHAIN_VERSION=4.7
APP_STL := stlport_shared

我已经尝试过默认的 GCC 4.6、实验性 4.7 和 clang3.1 工具链。
我已经尝试链接到 stlport_sharedgnustl_shared c++ 运行时库。
我试过FLAGS-std=c++11-std=c++0x-std=gnu++11

我能够使用 c++11 标准的 lambdas 和 auto,因此 C++11 标志似乎正在工作。但是,每当我尝试使用 shared_ptr、weak_ptr 或 unique_ptr 时,都会收到错误 'suchandsuch_ptr' is not a member of 'std'

我的 cpp 文件中有 #include <memory>。现在 Eclipse 告诉我 Unresolved inclusion: <memory>,但对于 <vector><string> 我得到了同样的结果,而且它们似乎编译和工作得很好。

Android NDK 中包含的工具链中是否没有实现智能指针?
如果不是,为什么不呢?由于 GCC 和 clang 支持智能指针已经有一段时间了,这意味着我要么遗漏了一些东西,要么 Android 开发人员出于某种原因禁用了它们。
有什么线索吗?

【问题讨论】:

  • 你确定它不会编译,还是只是编辑器没有解决包含?无论如何,问题肯定是它指向旧的头目录……我记得我有这个,但我不再使用 CDT 构建了。
  • 不仅仅是编辑器没有解决包含问题。它也没有编译。但它确实为 引用编译,即使编辑器也无法解析它们。对于我的项目,gnuc++ 包含目录指向 /android-ndk-r8d/platforms/android-14/arch-arm/usr/include
  • 应该有另一个以c++/ 结尾的包含目录。另外,“Android NDK 中包含的工具链中是否没有实现智能指针?” — 据我所知,GCC 4.7 不包含在 Android NDK 中。你具体用的是什么?
  • 根据developer.android.com/tools/sdk/ndk/index.html,他们将 GCC 4.7 编译器添加到 r8d:"- 将 GNU Compiler Collection (GCC) 4.7 编译器添加到 NDK"。当我添加/android-ndk-r8d/sources/cxx-stl/stlport/stlport/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.7/include 时,我现在可以编译了!但是,我仍然收到 IDE 错误,提示无法解析各种符号。
  • 您必须使用索引器设置来选择它使用的工具链/目标设置。

标签: c++ gcc c++11 android-ndk smart-pointers


【解决方案1】:

确保标准库包含路径(如/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/4.7/include)在目标设置中。

要让 IDE 识别 GNU 标准库中的 C++11 类,请将 __GXX_EXPERIMENTAL_CXX0X__ 作为预定义宏添加到索引器中。 (这个名字有点不合时宜,因为 C++11 是标准化的,并且支持不再是实验性的,但到目前为止还是这么称呼的。)另外,请确保索引器设置为反映正确的构建目标。

【讨论】:

  • 是的。这做到了。我现在可以编译并且 c++11 类不再有索引器错误。感谢您的帮助!
  • 我正在使用 Indigo 进行 Android NDK 开发。我找不到明确的方法来“向索引器添加预定义的宏”。设置 GXX_EXPERIMENTAL_CXX0X 宏的具体过程是什么?
  • @ArielMalka 首选项 => C/C++ => 代码辅助 => C++ 编译器 => 宏定义 => 添加。
  • 这并没有为我修复 Eclipse 索引器(使用 Eclipse Juno),所以我在“stackoverflow.com/questions/9375708/…”发布了一个对我有用的 hack。
  • @BigMacAttack 如何添加库路径?
【解决方案2】:

这些设置为我做到了:

Application.mk:

NDK_TOOLCHAIN_VERSION=4.7
APP_STL := gnustl_static

Android.mk:

LOCAL_CFLAGS :=-D__GXX_EXPERIMENTAL_CXX0X__  <--important
LOCAL_CPPFLAGS  := -std=c++11

Eclipse 设置: C/C++ General\Path 和 Symbols 应包含:

C:\android\ndk\sources\cxx-stl\gnu-libstdc++\4.7\include
C:\android\ndk\sources\cxx-stl\gnu-libstdc++\4.7\libs\armeabi\include

【讨论】:

  • 那是“-D__GXX_EXPERIMENTAL_CXX0X__”!我认为-std = c++ 11会暗示它,但它是这样工作的!谢谢
  • 我已经按照上述类似的方式完成了,但我收到错误 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZNSt13_Filebuf_base12_M_page_sizeE".Do you have any idea about the same
猜你喜欢
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多