【问题标题】:Why can't different stl implementations exist using NDK?为什么使用 NDK 不能存在不同的 stl 实现?
【发布时间】:2020-05-27 22:38:12
【问题描述】:

我尝试基于两个开源库构建一个项目。我使用的库是 OpenCV 和 ceres。 libopencv_java3.so 是来自网站 github 的 OpenCV3.1.2 版本,其中包括 OpenCV-3.1.0-android-sdk。 libceres.so 是我自己从源代码编译而来的。

当我构建我的应用程序时,NDK-build 会生成以下信息:

clang++.exe:警告:编译期间未使用的参数:'-nostdlib++' [-Wunused-command-line-argument]

错误:未定义引用 'cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector > const&)'

谷歌搜索后,我找到了一篇相关帖子

Error Undefined reference to 'std::__ndk1::locale::~locale()' 答案说使用了不同的 STL 实现。

就我而言,libopencv_java.so 可能使用 gnustl_static 而 libceres 使用 c++_static。 我不明白原因。这两个实现都是静态库,不应该发生冲突。

  1. opencv 版本中的所有so 文件都是用gnustl_static 编译的吗?
  2. 为什么 __ndk1 出现在 std::vector 中?
  3. 对于一个大型项目,不同的工程师承担不同的子任务。他们应该链接一个常见的 stl 实现吗?静态联动和动态联动的要求不同吗?

【问题讨论】:

  • 假设您想将std::vector 传递给两个库,您应该在主项目中使用哪个 stl 实现?
  • 这两个库都作为静态库与 STL 实现链接。这仍然是个问题吗?

标签: android c++ opencv ndk-build ceres-solver


【解决方案1】:

这个答案来晚了,但我希望它可以帮助遇到类似问题的人(就像我一样)。

opencv 版本中的所有so 文件都是用gnustl_static 编译的吗?

似乎 OpenCV 3.X-android(即使是在撰写本文时最新的 3.4.12)使用gnustl_statc。这意味着所有 stl 组件都驻留在命名空间 std 中。 但是对于 OpenCV 4.X-android,该库已使用 c++_static 编译,因此 stl 组件位于命名空间 std::__ndk1 中。

为什么 __ndk1 出现在 std::vector 中?

inline namespace

对于一个大型项目,不同的工程师承担不同的子任务。他们应该链接一个常见的 stl 实现吗?静态联动和动态联动的要求不同吗?

不确定...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多