Android NDK STL c++_shared w/LIBCXX_FORCE_REBUILD の結果が std::stringstream NOP になる 質問する

Android NDK STL c++_shared w/LIBCXX_FORCE_REBUILD の結果が std::stringstream NOP になる 質問する

要約:質問は、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: 0APP_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_OPTIMrelease/debug 、APP_STLc++_shared/c++_static 、 true/falseのさまざまな組み合わせをテストしました。結果は次のとおりです。LIBCXX_FORCE_REBUILDarmeabiarmeabi-v7aABI

|-------------+-----------+----------------------+---------+------------------|
| 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 に設定する必要があります。

おすすめ記事