Я создал файл dylib, используя fpcupdeluxe в freepascal, только с одной функцией cdecl _test, доступной как для 1) MacOS, так и 2) Debian (кросс-скомпилирован в x86_64 darwin)
Я пробовал вызвать dylib, используя 1) dlopen 2) мостовой заголовок 3) Framework
Dylib, скомпилированный на MacOS, работал со всеми тремя методами. Однако, когда я заменил этот dylib на тот, который я скомпилировал на debian, похоже, работает только dlopen, другие 2 метода, использующие заголовок моста и фреймворк, дали мне эту ошибку: dyld: lazy symbol binding failed: Symbol not found: _test
Я сделал nm -gU на обоих dylib, и только относительный виртуальный адрес функции _test отличается, что я могу сделать, чтобы исследовать причину этого и решить ее?
otool -L для
Нерабочий
XXXXX.dylib: /home/wire/fpcupdeluxe/projects/XXXXX.dylib (версия совместимости 0.0.0, текущая версия 0.0.0) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (версия совместимости 45.0.0). 0, текущая версия 1404.0.0) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (версия совместимости 300.0.0, текущая версия 1252.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/ A / CoreFoundation (версия совместимости 150.0.0, текущая версия 1253.0.0) /usr/lib/libSystem.B.dylib (версия совместимости 1.0.0, текущая версия 1225.1.1)
Работающий
/Users/wire/XXXXX.dylib: /Users/wire/XXXXX.dylib (версия совместимости 0.0.0, текущая версия 0.0.0) /usr/lib/libSystem.B.dylib (версия совместимости 1.0.0, текущая версия 1281.100 .1)
Где XXXXX - это имя моей библиотеки, я также заметил, что путь для рабочей и нерабочей библиотеки отличается. В нерабочем случае мой dylib указывает на каталог на моей Linux-машине, который не должен присутствовать на Mac. Я также попытался выполнить кросс-компиляцию в Windows, и путь был в C: \, и ошибка была не найдена, мне нужно изменить этот путь? Я новичок в программировании MacOS
LC_LOAD_DYLIB
для AppKit и Foundation из двоичного файла dylib, который создается цепочкой кросс-компилятора Debian. Вы можете добиться этого, используя метод, который я описал в своем ответе здесь stackoverflow.com/questions/60497896/jtool2
доступен как в MacOS, так и в Linux. Поступая так, вы должны хотя бы узнать, виноваты ли эти дополнительные фреймворки или что-то еще. - person Kamil.S   schedule 08.04.2020