【问题标题】:What this error means and how to solve it?这个错误意味着什么以及如何解决它?
【发布时间】:2011-08-25 06:08:43
【问题描述】:

我正在尝试在 android 中使用 NDK 构建 C++ 代码。我有一个方法,它有一个参数vector < vector <float> > coordinates

一切正常,直到我在我的方法中写下这一行

vector<float> firstPoint = coordinates.at(0);

我开始收到此错误

D:/eclipseworkspace/myLibProject/obj/local/armeabi/libmyLibProject.a(FileName.o): In function `std::priv::_Vector_base<std::vector<float, std::allocator<float> >, std::allocator<std::vector<float, std::allocator<float> > > >::_M_throw_out_of_range() const':
D:/androidndk/sources/cxx-stl/stlport/stlport/stl/_vector.c:45: undefined reference to `std::__stl_throw_out_of_range(char const*)'
collect2: ld returned 1 exit status
make: *** [/cygdrive/d/eclipseworkspace/myLibProject/obj/local/armeabi/libOutputName.so] Error 1

我不知道为什么会发生这种情况,Google 也没有提供帮助。

谢谢。

【问题讨论】:

  • 索引 0 处有元素吗?看起来坐标是空的。
  • 正如我所说,坐标是此方法的参数,这是编译时错误而不是运行时错误。是的,在运行时坐标最终将至少有一个值
  • 你是如何编译和链接你的代码的?您是否可能缺少标准库?
  • 如果编译器无法找到库那么为什么当我尝试访问值而不是在方法参数中声明它时会出现错误?
  • 因为vector的实现大部分都在头文件中,所以不需要库。在您的情况下,除了vector :: at抛出的异常类之外,似乎所有内容都在头文件中。这似乎完全正常。 (STLPort 的一个令人困惑的方面是您会看到对 _vector.c 的引用,但如果您检查 STLPort 代码,您会发现 _vector.c 包含在矢量头文件中。

标签: android c++ compiler-errors android-ndk android-stlport


【解决方案1】:

我认为您在同一个项目中使用了标准库的两种不同实现。

看起来您正在使用 D:/android... 中标准库的 stlport 实现(的头文件)编译文件,并且链接到本地​​库。

您必须在您的 ide(或 Makefile)中配置链接器以使用相同实现的 lib 文件(我猜是在 D:/android 中的某处)。

【讨论】:

    【解决方案2】:

    这是一个链接错误。您需要将APP_STL := stlport_static 添加到您的Apllication.mk 文件中。还要确保使用 -fno-exceptions 标志,因为 STLport 与 C++ 异常和 RTTI 不兼容。

    您可以在 NDK 的 docs 文件夹中的 APPLICATION-MK.HTML 中获取更多信息。 CPLUSPLUS-SUPPORT.HTML 也值得一读。

    【讨论】:

    • 确保使用-fno-exceptions 标志。 STLport 与 C++ 异常和 RTTI 不兼容。
    • @Haris Hasan,那是因为坐标[0] 不应该抛出异常,它不检查边界。您需要使用-fno-exceptions 标志编译您的项目。
    • 我做到了,但即使那样我也会遇到同样的错误,除非我使用[]
    【解决方案3】:

    这看起来像一个链接器错误。您可能忘记将 STL 库引用添加到您的构建中。或者找不到

    【讨论】:

      【解决方案4】:

      这是你做的吗?

      #include <stdexcept>
      #include <vector>
      using namespace std;
      

      【讨论】:

        【解决方案5】:

        当我改变时

        vector<float> firstPoint = coordinates.at(0);
        

        vector<float> firstPoint = coordinates[0];
        

        它开始编译..... :s y?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-25
          • 1970-01-01
          • 2018-09-04
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          相关资源
          最近更新 更多