Я создал 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 в стеке вызовов.
Когда я запускаю это приложение из 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 на соответствующий класс, используемый в разделе инициализации.