Android NDK STL c ++ _ shared w/LIBCXX_FORCE_REBUILD导致std :: stringstream NOP

swa*_*log 24 c++ android stl android-ndk

tl; dr:这个问题是为了解释为什么std::stringstream"失败",以及为什么它在链接到重建的c ++ _共享库时失败的方式(通过简单地什么都不做).

一个最小的例子:

std::stringstream ss;
ss << "Hello World";
__android_log_print(ANDROID_LOG_INFO,
                   "APP",
                   "Length: %i", ss.str().size());
Run Code Online (Sandbox Code Playgroud)

使用时编译项目

APP_STL := c++_shared
LIBCXX_FORCE_REBUILD := true
Run Code Online (Sandbox Code Playgroud)

输出是Length: 0.当使用APP_STL := c++_staticLIBCXX_FORCE_REBUILD := false,stringstream按预期工作时,Length: 11作为输出.

我正在使用STL的很多部分,到目前为止我看到的唯一明显的区别是这个沉默NOP stringstream.我还通过修改libgl2jniNDK示例测试了这一点,将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
Run Code Online (Sandbox Code Playgroud)

我已经测试了APP_OPTIM作为发布/调试的各种排列,APP_STL如c ++ _ shared/c ++ _ static,以及LIBCXX_FORCE_REBUILD在Nexus-4上的true/false,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               |
|-------------+-----------+----------------------+---------+------------------|
Run Code Online (Sandbox Code Playgroud)

[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():error:未定义引用'__atomic_fetch_add_4'

PS:确保ndk-build clean在这些测试之间进行.

问题: 任何人都可以std::stringstream根据这些情况给出一些有关失败原因的信息,以及为什么只通过对流向它的任何数据执行NOP而失败?

谢谢

小智 22

我无法回答为什么NOP在一些排列中发生.但我确实设法找出了构建失败的原因.

我的情况比你糟糕.我遇到了与使用c ++ _ static和LIBCXX_FORCE_REBUILD(false)的默认值相关的构建失败,并且不知道为什么.

感谢您将您的研究分享到链接STL的各种排列 - 我能够直接跳到显着的文档来修复构建错误.

如果你#include,你可能需要libatomic.为ndk-build添加"LOCAL_LDLIBS + = -latomic"

为了能够使用libatomic,您需要将NDK_TOOLCHAIN_VERSION设置为4.8