0

私の問題はたまたま FFmpeg にありますが、これはほぼすべての C ライブラリで発生すると思われます。

問題の説明

私のアプリは、NDK r10e でコンパイルされた FFmpeg を使用しています。Googleはgccよりもclangを使用することを好むため、clangに切り替えながら、すべてをNDK r17に更新しようとしています。

私の最初のステップは、FFmpeg をビルドすることです。

そのために、make_standalone_toolchain.pyスクリプトを使用して、次のように x86 アーキテクチャ用のスタンドアロン ツールチェーンを作成しました。

make_standalone_toolchain.py --arch x86 --api 21 --install-dir ~/Development/ndk-toolchains/x86

次に、FFmpeg ビルドを次のように構成します。

TOOLCHAIN_DIR=~/Development/ndk-toolchains/x86

./configure \
--prefix=$(pwd)/android/x86 \
--cross-prefix=$TOOLCHAIN_DIR/bin/i686-linux-android- \
--target-os=android \
--arch=x86 \
--enable-cross-compile \
--disable-asm \
--toolchain=clang-usan \
--disable-stripping \
--extra-cflags="-m32" \
--sysroot=$TOOLCHAIN_DIR/sysroot/

そして、次のようにビルドします。

make clean
make -j4
make install

すべてが正常にコンパイルされているように見えますが、すべて同じことを示すいくつかのリンカ エラーが発生します。

「__mulodi4」への未定義の参照

私が試した解決策

1. libclang_rt.builtins* へのリンク

これは、libgcc が__mulodi4. sitsofe という名前の github ユーザーは、ここに回避策を投稿してくれました。libclang_rt.builtins-i686.aただし、このライブラリがどこにあるかは確かです。スタンドアロンのツールチェーン ディレクトリで見つけたものは次のとおりです。

./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-x86_64.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i386.a ./lib64/clang/6.0. 2/lib/linux/libclang_rt.builtins-aarch64-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-mips64-android.a ./lib64/clang/6.0.2/lib/ linux/libclang_rt.builtins-x86_64-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i686-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt. builtins-arm-android.a ./lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-mips-android.a

libclang_rt.builtins-i686-android.a図書館は近くに見えますが、(私が思うに)葉巻はありません。リンクしようとすると、同じエラーが発生します。

「__mulodi4」への未定義の参照

これが私の新しいFFmpegビルド構成コマンドです:

./configure \
--prefix=$(pwd)/android/x86 \
--cross-prefix=$TOOLCHAIN_DIR/bin/i686-linux-android- \
--target-os=android \
--arch=x86 \
--enable-cross-compile \
--disable-asm \
--toolchain=clang-usan \
--disable-stripping \
--extra-cflags="-m32" \
--extra-ldflags="-L${TOOLCHAIN_DIR}/lib64/clang/6.0.2/lib/linux/libclang_rt.builtins-i686-android.a" \
--sysroot=$TOOLCHAIN_DIR/sysroot/

-vこの行がリンカーフラグに追加されていることを確認するために確認しましたが、そうでした。ただし、このライブラリが機能することが期待されるかどうか、ましてやリンカー フラグに正しく追加されているかどうかはわかりません。いずれにせよ、私がここでやっていることはうまくいきません。

2.別の消毒剤への切り替え

未定義のサニタイザーを使用する代わりに、アドレス サニタイザーに切り替えてみました。今週の Google I/O で r17 で asan が利用可能になるという漠然とした言及に基づいて、これは (率直に言って) 完全な闇の攻撃です。

この場合、FFmpeg は正常にビルドされます。

ただし、FFmpeg をテスト プロジェクト (C++ をサポートする単純な AAR で、 を呼び出す jni メソッドが 1 つだけあるプロジェクト) にプルしようとすると、大量av_gettime()のリンカー エラーが発生します。

エラー: エラー: '__asan_option_detect_stack_use_after_return' への未定義の参照
エラー: エラー: '__asan_stack_malloc_0' への
未定義の参照 エラー: エラー:
'__asan_report_load4' への未定義の参照 エラー: エラー: '
__asan_report_load4' への未定義の参照
エラー: エラー: '__asan_option_detect_stack_use_after_return' への未定義の参照
エラー: エラー: '__asan_stack_malloc_0' への未定義の
参照 エラー: エラー: '__asan_report_load4' への
未定義の参照 エラー: エラー: '__asan_report_load4' への
未定義の参照__asan_shadow_memory_dynamic_address'
エラー: エラー: '__asan_option_detect_stack_use_after_return' への未定義参照
エラー: エラー: '
__asan_stack_malloc_0' への
未定義参照 エラー: エラー: '
__asan_report_store4' への未定義参照
エラー: エラー: '__asan_version_mismatch_check_v9' への未定義の参照

したがって、FFmpeg ライブラリは問題なく見つかったようで、CMake ファイルのその部分は正しいことを示していますが、これらの asan 参照を見つけることができません。

これは、人々が遭遇する一般的な問題のようですが、実際に機能する回避策を見つけることができません。

4

1 に答える 1