NDK プロジェクトで「未定義の参照」リンカー エラーが発生し始めています。これらが通常何であるかを理解しています。つまり、.h ファイルで宣言されている .cpp ファイルにないメソッドです。
2 つの静的ライブラリ 'libTTComponents.a' と 'libTTDialogs.a' にリンクするメインの共有ライブラリがあります。静的ライブラリ 'libTTDialogs.a' は、'libTTComponents.a' で定義された C++ クラスを使用します。これは、最近変更を加えるまで機能していました。残念ながら、このプロジェクトはクロスプラットフォーム プロジェクトであり、最後に Android で作業して以来、Windows で多くの変更を行ってきました。すべての変更を段階的に行うには、非常に時間がかかります。
すべての外部参照を含むリスト ファイルを生成するスタティック ライブラリをビルドするときに有効にできるリンカー/コンパイラ スイッチはありますか?
静的ライブラリをメインの共有ライブラリにリンクしようとするときに、静的ライブラリに実際にあるものをマップ ファイルに対して相互参照できるようにしたいと考えています。これにより、リンカが特定の参照が欠落していると考える理由を特定できます。
静的ライブラリとメイン モジュールの両方の Android.mk ファイルが変更されていないため、現在完全に途方に暮れています。
更新:「nm」を使用して .a ファイル内のシンボルを表示できることがわかりました。
nm libTTComponents.a
これにより、次の行が表示されます(特に):
00000000 T _ZN11CSampleEdit4DrawEv
CSampleEdit クラスのメソッドを含むファイル SampleEdit.cpp があります。特に、リンカーが見つけられない CSampleEdit::Draw() メソッドに注目しています。
[armeabi-v7a] SharedLibrary : libmain.so
/Android/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: /work/TT/android-TT/jniLibs/armeabi-v7a/libTTDialogs.a(BaseDialog.o): in function CBaseDialog::DrawSampleEdits():/work/TTracker/BaseDialog.cpp:730: error: undefined reference to 'CSampleEdit::Draw()'
静的ライブラリ .a ファイル内にあるシンボルを確認できることがわかったので、他の静的ライブラリまたはモジュールがアクセスしようとしているものを特定する方法はありますか? 上記のエラーは、他のライブラリ libTTDialogs.a が libTTComponents.a ライブラリ内にある CSampleEdit::Draw() を見つけられないことを示しています。
私も発見しました:
ar x libTTComponents.a
これにより、次のようなエラーが大量に発生します。
SampleEdit.o/: No such file or directory
.a ファイルが .o ファイルとは別の場所にあります。これが「ar」がこれらのエラーを表示する理由なのか、それとも .o ファイルを libTTComponents と同じフォルダに置く必要があるのか わかりません。を。別のライブラリをコンパイルしてリンクするには、libTTComponents.a (および私の .h ファイル) だけで十分だと思っていたでしょう。
興味深いことに、すべての libTTComponents.a ソース ファイルをメイン モジュールの Android.mk に追加すると、エラーなしでリンクされます。
libTTDialogs がビルドされたときに、libTTComponents 自体がビルドされたときに作成されたシンボルと比較して、libTTComponents クラスに対して異なるシンボルが作成されたのではないかと考え始めています。