2

私はいくつかのものを Android に移植しており、(Android NDK を使用して) .so ファイルにリンクする必要があるいくつかの静的ライブラリがあります。-Wl,-whole-archiveリンカーを使用してみました (そして、適切な で終了しました-Wl,-no-whole-archive) が、次のようなエラーが発生します。

c:/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld.exe : error : C:/Users/Brent/Documents/git/gamelib/Core/Android/Android/Debug/Core-Android.a:
member at 25678 is not an ELF object [C:\Users\Brent\Documents\git\blackjack\blackjack-android.vcxproj]

また、まだ実装されていないが、実装されているが使用されていない他の関数によって呼び出される関数への未定義の参照が多数あります (通常は削除されます)。全体はまだ移植されていませんが、このため、-whole-archive を使用して既存のコードをテスト (またはビルド) することはできません。もっときめの細かいものが必要です。

__attribute__((used))そこで、静的ライブラリで関数を宣言するときに使用してみることにしました。

extern "C" {
    void Java_com_brainium_blackjack_BlackjackJNILib_step(JNIEnv* _jni_env, jobject jthis) __attribute__ ((visibility ("default"))) __attribute__ ((used));
};
void Java_com_brainium_blackjack_BlackjackJNILib_step(JNIEnv* _jni_env, jobject jthis) {
}

しかし、それでも剥がれます。.so に直接コンパイルされた .cpps の 1 つに入れられたこのコードは正常に動作しますが、それを静的ライブラリに入れ、その lib を にリンクすると、動作しません。nm を使用して、それが実際に除外されていること、および静的ライブラリの他のシンボル (参照されている) が存在することを確認しました (したがって、リンクは一般的に機能しています)。正常__attribute__((used))に機能していませんか、それとも使い方が間違っているだけですか? ありがとう。

補足: このプロジェクトのビルドに ndk-build (または make ファイル) は使用していません。私はvs-androidを使用(および拡張)しています。

編集:もう少し検索した後、リンカが参照を見ない場合__attribute__((used))、.oファイルも検査されないため、何もしないようです。これはまた、他の方法 (.o ファイルを 1 つの .o ファイルに結合するか、-u オプションを使用する) ですべての .o ファイルを強制的に読み取るように強制した場合でも、同じ効果があることを示唆しています。 --whole-archive として。働くことが唯一の解決策かもしれないようです。--whole-archive

4

1 に答える 1

0

NDK の make ファイルを使用している場合は、ホスト ライブラリまたは実行可能ファイルにLOCAL_WHOLE_STATIC_LIBRARIESリンクする代わりに、リンクを試みることができます。LOCAL_STATIC_LIBRARIESこれにより、静的ライブラリから何も削除されなくなります。

粒度はあまりありませんが...

于 2014-01-28T00:49:56.927 に答える