android - 为什么使用 NDK 不能存在不同的 stl 实现?
问题描述
我尝试基于两个开源库构建一个项目。我使用的库是 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。我不明白原因。这两个实现都是静态库,不应该发生冲突。
- 来自 opencv 版本的所有文件都是用 gnustl_static 编译的吗?
- 为什么 __ndk1 出现在 std::vector 中?
- 对于一个大型项目,不同的工程师承担不同的子任务。他们应该链接一个常见的 stl 实现吗?静态联动和动态联动的要求不同吗?
解决方案
这个答案来晚了,但我希望它可以帮助遇到类似问题的人(就像我一样)。
来自 opencv 版本的所有文件都是用 gnustl_static 编译的吗?
似乎 OpenCV 3.X-android(甚至是撰写本文时最新的 3.4.12)使用gnustl_statc
. 这意味着所有 stl 组件都驻留在 namespace 中std
。但是对于 OpenCV 4.X-android,该库已使用 编译c++_static
,因此 stl 组件位于命名空间中std::__ndk1
。
为什么 __ndk1 出现在 std::vector 中?
它是内联命名空间。
对于一个大型项目,不同的工程师承担不同的子任务。他们应该链接一个常见的 stl 实现吗?静态联动和动态联动的要求不同吗?
不确定那...
推荐阅读
- r - 将 MongoDB 与 R 结合使用——如何仅将嵌套对象作为数据框进行查询和返回?
- excel - Excel VBA IF 语句被跳过
- postgresql - PostgreSQL 重用计算结果作为其他选择计算的输入
- external-tables - Spectrum 相同的外部表在多个模式中显示 (svv_external_tables)
- linux - PostgreSQL 数据库中的 Linux 系统利用率导入
- asp.net-mvc - 使用 HttpClient 的 ASP.NET MVC 大文件下载
- javascript - 我们应该为 Vue.js 中的自定义表单组件使用原生输入事件吗?
- makefile - Make:超级忽略错误
- firefox - 如何复制 POST 的消息正文?
- javascript - 在调试模式和正常模式之间反应原生不同的行为