要約:質問は、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 の多くの部分を使用していますが、これまでのところ、目立った違いはこの silent だけです。また、 NDK サンプルを変更して、Application.mk ファイルを次のように追加して、NOP
stringstream
これをテストしました。libgl2jni
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
Nexus-4 で、 との両方をターゲットとして、APP_OPTIM
release/debug 、APP_STL
c++_shared/c++_static 、 true/falseのさまざまな組み合わせをテストしました。結果は次のとおりです。LIBCXX_FORCE_REBUILD
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:関数 std::_1::ios_base::xalloc(): エラー: '__atomic_fetch_add_4' への未定義の参照
追伸:ndk-build clean
これらのテストの間に必ず実行してください。
質問:std::stringstream
このような状況で失敗する理由、また、ストリーミングされるデータに対して NOP を実行するだけで失敗する理由について、どなたか詳しい情報を教えていただけませんか?
ありがとう
ベストアンサー1
いくつかの組み合わせで NOP が発生する理由については答えられません。しかし、ビルドの失敗についてはなんとか調べることができました。
私はあなたよりも悪い状況にありました。c++_static の使用と LIBCXX_FORCE_REBUILD のデフォルト値 (false) の組み合わせに関連するビルドの失敗を経験していましたが、その理由がわかりませんでした。
STL をリンクするさまざまな組み合わせに関する調査結果を共有していただき、ありがとうございます。重要なドキュメントに直接アクセスして、ビルド エラーを修正することができました。
#include を使用する場合は libatomic が必要になる可能性があります。ndk-build に "LOCAL_LDLIBS += -latomic" を追加します。
libatomic を使用するには、NDK_TOOLCHAIN_VERSION を 4.8 に設定する必要があります。