2 つの外部静的ライブラリ B と C にリンクする必要がある共有ライブラリ A を構築しているとします。必要なのは、libB.a と libC.a とそれらのヘッダー ファイルだけです。
libA の単純化された Android.mk を次に示します。
LOCAL_LDLIBS := ../external/libB.a ../external/libC.a
include $(BUILD_SHARED_LIBRARY)
私の知る限り、共有ライブラリのリンクが機能する方法は次のとおりです。
- B と C のすべてのオブジェクト ファイルを取得します。
- A が参照しないオブジェクト ファイルを取り除く
- B と C の参照を解決する
これにより、B と C が相互に呼び出し、具体的には、A が呼び出さなかったために手順 2 で削除された関数を呼び出すため、リンク エラーが発生します。
静的ライブラリを自分で作成した場合は、LOCAL_STATIC_LIBRARIES を LOCAL_WHOLE_STATIC_LIBRARIES に置き換えるだけで済みます。これにより、コードのストリッピングが防止されます (コード サイズが犠牲になります)。内部では、 --whole-archive をリンカーに渡します。
B と C をビルドしていない (そして、それらを再ビルドするためのソースすら持っていない) ため、どのようなオプションがありますか?
- A から欠落している関数を手動で参照して、削除されないようにする
- --whole-archive を外部静的ライブラリのリンカーに渡す方法を理解する
- PREBUILT_STATIC_LIBRARY を使用します (言及されていますが、使用したことはありません。ドキュメントによると、この場合は適用できないようです)
- 共有ライブラリの代わりに実行可能ファイルをビルドします (同じようにコードを削除しません)。
- 外部ライブラリを移動/名前変更して、NDKビルドシステムをだましてそれらが私のものだと思わせ、LOCAL_WHOLE_STATIC_LIBRARIESに追加できるようにします。
オプション 1 が最初に機能したため、オプション 1 を使用しましたが、明らかに良くありません。より良い解決策があるかどうかを尋ねています。
この質問への回答 (事前にビルドされた静的ライブラリと共有ライブラリを Android NDK でリンクする際の問題) は、ビルド セットアップ (外部静的ライブラリにリンクする共有ライブラリ) を再評価する必要があるかどうか疑問に思いました。そこにコメントすることはできないので、ここで私自身の質問をしました。