为什么使用 NDK 不能存在不同的 stl 实现?

Why can't different stl implementations exist using NDK?

本文关键字:stl 实现 存在 NDK 不能 为什么      更新时间:2023-10-16

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

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

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

error: 未定义对 'cv::imwrite(cv::String const&, cv::_InputArray const&, std::__ndk1::vector> const&(' 的未定义引用

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

错误 未定义对"std::__ndk1::locale::~locale(("的引用 答案是使用不同的 STL 实现。

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

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

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

opencv 版本中的所有文件都是用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 中?

它是内联命名空间

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

不确定...