0

我开始在 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 本身时创建的符号不同。

4

0 回答 0