我开始在 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
我有一个文件 SampleEdit.cpp,其中包含我的 CSampleEdit 类的方法。我特别关注链接器找不到的 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 本身时创建的符号不同。