- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
tl;dr: 问题是为了解释为什么 std::stringstream
“失败”,以及为什么它以它的方式失败(通过简单地做什么都没有),当链接到重建的 c++_shared 库时。
一个最小的例子:
std::stringstream ss;
ss << "Hello World";
__android_log_print(ANDROID_LOG_INFO,
"APP",
"Length: %i", ss.str().size());
编译项目时使用
APP_STL := c++_shared
LIBCXX_FORCE_REBUILD := true
输出为 Length: 0
。当使用 APP_STL := c++_static
或 LIBCXX_FORCE_REBUILD := false
时,stringstream
按预期工作,Length: 11
作为输出。
我正在使用 STL 的许多部分,到目前为止我看到的唯一明显的区别是这个无声的 NOP
stringstream
。我还通过修改 libgl2jni
NDK 示例对此进行了测试,将 Application.mk 文件添加为:
NDK_TOOLCHAIN_VERSION := 4.8
APP_OPTIM := release
APP_STL := c++_shared
APP_ABI := armeabi-v7a #armeabi-v7a x86
APP_PLATFORM := android-19
LIBCXX_FORCE_REBUILD := true
我已经测试了 APP_OPTIM
作为发布/调试、APP_STL
作为 c++_shared/c++_static 和 LIBCXX_FORCE_REBUILD
的各种排列code> 为真/假,在 Nexus-4 上,armeabi
和 armeabi-v7a
作为目标 ABI
。结果如下:
|-------------+-----------+----------------------+---------+------------------|
| ABI | stl c++_? | LIBCXX_FORCE_REBUILD | optim | Result |
|-------------+-----------+----------------------+---------+------------------|
| armeabi | static | true | release | OK |
| | static | true | debug | OK |
| | static | false | release | BUILD FAILED [1] |
| | static | false | debug | BUILD FAILED [1] |
| | shared | true | release | NOP |
| | shared | true | debug | NOP |
| | shared | false | release | OK |
| | shared | false | debug | OK |
|-------------+-----------+----------------------+---------+------------------|
| armeabi-v7a | static | true | release | OK |
| | static | true | debug | OK |
| | static | false | release | OK |
| | static | false | debug | OK |
| | shared | true | release | NOP |
| | shared | true | debug | NOP |
| | shared | false | release | OK |
| | shared | false | debug | OK |
|-------------+-----------+----------------------+---------+------------------|
[1]/opt/android-ndk-r9d/sources/cxx-STL/llvm-libc++/libs/armeabi/libc++static.a(ios.o):/tmp/ndk-andrewhsieh/tmp/build-21097/build-libc++/ndk/sources/cxx-STL/llvm-libc++/libcxx/src/ios.cpp:function std::_1::ios_base::xalloc():错误: undefined reference “__atomic_fetch_add_4”
PS:确保在这些测试之间执行 ndk-build clean
。
问题:任何人都可以深入了解为什么 std::stringstream
在这些情况下会失败,以及为什么只对流式传输到它的任何数据执行 NOP 就会失败?
谢谢
最佳答案
我无法回答为什么在某些排列中会出现 NOP。但我确实设法找出了构建失败的原因。
我的处境比你更糟。我遇到了与使用 c++_static 和 LIBCXX_FORCE_REBUILD (false) 的默认值组合相关的构建失败,不知道为什么。
感谢您分享您对链接 STL 的各种排列的研究 - 我能够直接跳转到重要文档以修复构建错误。
It's likely that you need libatomic if you #include . Add "LOCAL_LDLIBS += -latomic" for ndk-build
为了能够使用 libatomic,您需要将 NDK_TOOLCHAIN_VERSION 设置为 4.8
关于Android NDK STL c++_shared w/LIBCXX_FORCE_REBUILD 导致 std::stringstream NOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041401/
tl;dr: 问题是为了解释为什么 std::stringstream “失败”,以及为什么它以它的方式失败(通过简单地做什么都没有),当链接到重建的 c++_shared 库时。 一个最小的例子:
我是一名优秀的程序员,十分优秀!