.dylib, сделанный с Delphi XE2, не может использоваться приложением Xcode - PullRequest
2 голосов
/ 13 февраля 2012

Я создал 32-битный dylib для OS X с Delphi XE2 Upd.3. Это имя установки использует @rpath.Весь экспорт начинается с подчеркивания, проверяется с помощью otool.Экспорт использует соглашение о вызовах "cdecl" в Delphi.

Я не могу заставить этот dylib работать с 32-битным хост-приложением в Xcode 4.3, работающем на OS X 10.7.3.Когда я запускаю тестовый проект из Xcode, он останавливается при вызове lib и dyld_start в стеке вызовов.

enter image description here

Когда я запускаю это приложение из Finder (из папки Xcode в пользовательской библиотеке), я получаю ошибку Image Not Found от dyld.

Я уже добавил фазу сборки copy, которая копирует dylib (и libcgunwind.1.0.dylib, который ему требуется) в каталог Products.Я также установил для Runpath Search Paths значение @executable_path или @loader_path, но все безрезультатно.

Метод импортируется через

extern int TestLib(int AInt);

Библиотека настолько минимальна, насколько это возможнопросто содержит этот блок:

unit LibTestExports;

uses
  System.Classes,
  System.SysUtils;

function _TestLib(AInt: Integer): Integer; export; cdecl;
begin
  Result:= AInt + 2;
end;

exports
  _TestLib;

end.

У меня нет идей о том, что вызывает это и как я могу заставить это работать.

Проект Xcode и libs можно найти здесь: http://dl.dropbox.com/u/17403534/CAS4LibTest.zip

ОБНОВЛЕНИЕ: Эта проблема, похоже, связана со Львом!Он отлично работает в Snow Leopard 10.6.4 с использованием Xcode 4.2.(Xcode 4.2 на Lion приводит к той же проблеме)

Тот же самый dylib также отлично работает под Lion, когда используется приложением FireMonkey (методы статически импортируются с использованием external 'libName').

Запустив то же приложение под Lion, которое отлично работает под SnowLeopard, я получаю отчет о сбое, содержащий следующий стек вызовов:

0   ???                             0x0013317c 0 + 1257852
1   libCAS4.dylib                   0x00010b5c @DbgEvalFrame + 1648
2   libCAS4.dylib                   0x00010e1a @DbgEvalFrame + 2350
3   dyld                            0x8fe55203 ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) + 251
4   dyld                            0x8fe54d68 ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 64
5   dyld                            0x8fe522c8 ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 256
6   dyld                            0x8fe5225e ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) + 150
7   dyld                            0x8fe53268 ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 62
8   dyld                            0x8fe47694 dyld::initializeMainExecutable() + 214
9   dyld                            0x8fe4bf99 dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**) + 2238
10  dyld                            0x8fe452ef dyldbootstrap::start(macho_header const*, int, char const**, long, macho_header const*) + 637
11  dyld                            0x8fe45063 _dyld_start + 51

Обходной путь: Поддержка Embarcadero сейчасвернулся с обходным путем, который исправляет проблему для меня: в локальной копии System.Classes измените объявление GlobalNameSpace: IReadWriteSync на соответствующий класс, используемый в разделе инициализации.

1 Ответ

2 голосов
/ 14 февраля 2012

Библиотека, которую вы создаете, имеет неявную зависимость от bplrtl160.dylib, которую вам необходимо связать с приложением. Вы должны убедиться, что библиотека построена с использованием пакетов времени выполнения.

Существует некоторая форма магии инициализации, которая возникает при сборке исполняемого файла с Delphi XE2, чего не происходит при сборке приложения под xcode, что вызывает проблему;вероятно, какой-то код инициализации, который связан с приложением, которое не связано, когда оно сделано в виде библиотеки.

Фактическое исключение, которое вы получаете, находится в:

@$xp$30System@Sysutils@IReadWriteSync

, что происходитв bplrtl160.dylib время загрузки (т.е. к этому моменту вы даже не взаимодействуете с библиотекой).Это интерфейсный класс, который должен быть инициализирован во время загрузки приложения.

Если вы удалите записи System.SysUtils, System.Classes из условия использования файла библиотеки, тогда он фактически загрузит библиотеку;но это означает, что любая библиотека, которую вы строите из XE2, не может использовать код классов и sysutils;что делает его немного менее подходящим для использования.

Что касается исправления;Я не знаю.Там может быть не исправить вообще.

...