#android #android-ndk #ld #map-files
#Android #android-ndk #ld #map-файлы
Вопрос:
Я начинаю получать ошибки компоновщика «неопределенная ссылка» в проекте NDK. Я понимаю, что это обычно такое — ie — метод, отсутствующий в файле .cpp, который объявлен в файле .h.
У меня есть основная разделяемая библиотека, которая ссылается на 2 статические библиотеки ‘libTTComponents.a’ и ‘libTTDialogs.a’. Статическая библиотека ‘libTTDialogs.a’ использует классы C , определенные в libTTComponents.a’. Это работало до тех пор, пока я недавно не внес изменения. К сожалению, проект является кроссплатформенным проектом, и я внес ряд изменений в Windows с тех пор, как в последний раз работал на Android, и постепенное прохождение всех изменений займет очень много времени.
Есть ли переключатель компоновщика / компилятора, который я могу включить при создании своих статических библиотек, который создаст файл списка, содержащий все внешние ссылки?
Я хотел бы иметь возможность сопоставлять ссылки на то, что на самом деле находится в статических библиотеках, с файлом карты, когда я пытаюсь связать статические библиотеки с основной общей библиотекой. Это позволило бы мне определить, почему компоновщик считает, что определенные ссылки отсутствуют.
Мой 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()'
Теперь, когда я знаю, что могу видеть, какие символы находятся в файле static library .a, есть ли способ определить, к каким другим статическим библиотекам или модулям пытаются получить доступ? Приведенная выше ошибка показывает, что моя другая библиотека libTTDialogs.a не может найти CSampleEdit::Draw(), которая находится внутри libttcontents.библиотека.
Я также обнаружил:
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 для классов LIBTTCONTENTS создаются разные символы по сравнению с символами, созданными при создании самого libttcontents.
Комментарии:
1. Здесь только предположение, но это может быть связано с порядком ссылок ваших библиотек? Компоновщик обрабатывает библиотеки в том порядке, в котором они отображаются в командной строке, поэтому, если libfoo.a зависит от libbar.a, но у вас есть
-lfoo -lbar
, он не сможет найти символы из libbar.a .2. @DanAlbert спасибо — я могу попробовать. Я подозреваю, что это относится к одной библиотеке, использующей класс другой библиотеки, и наоборот. У меня есть рабочая копия версии 750 и сломанная версия 1008 .. где-то между ними лежат доказательства. Жаль, что у меня не было автоматической сборки, чтобы гарантировать, что моя версия для Android / iOS продолжит сборку. 🙂