gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:01:00 24 4
gpt4 key购买 nike

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++_staticLIBCXX_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 上,armeabiarmeabi-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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com