我开始得到"未定义的引用" 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.a位于同一文件夹中。我本以为libTTComponents.a本身(加上我的.h文件)足以让另一个库被编译并链接到它。
有趣的是,如果我将所有libTTComponents.a源文件添加到主模块的Android.mk中,它会毫无错误地链接。
我开始怀疑在构建libTTDialogs时为libTTComponents类创建的不同符号与构建libTTComponents本身时创建的符号相比。