Как мне правильно предоставить libfbclient.dylib для запуска Firedac/Firebird в OSX, чтобы избежать сбоя с этим сообщением (здесь на немецком языке):
EFDException: [FireDAC][Phys][FB]-314. Laden der Herstellerbibliothek [libfbclient.dylib or libfbembed.dylib] nicht möglich.
Чтобы избежать некоторых вопросов заранее: программное обеспечение, которое я компилирую, уже отлично работает в Windows и Linux, в OSX оно просто не найдет libfbclient.dylib. Также все модульные тесты, не связанные с БД, отлично работают на всех трех платформах. И я убедился, что дилибы имеют 64-битность, как и исполняемый файл, я взял их из свежей установки firebird 3 на том же Mac. Проект представляет собой сервер приложений (служба Windows или демон Linux/OSX).
Я создаю все компоненты динамически и обычно храню fbclient и другие необходимые библиотеки в папке a вместе с исполняемым файлом, поскольку я никогда не пишу что-то в системные папки клиентов и стараюсь по возможности избегать изменения таких вещей, как системный путь.
const
{$IFDEF MSWINDOWS}
CLIENTNAME = 'fbclient.dll';
{$ENDIF}
{$IFDEF LINUX}
CLIENTNAME = 'libfbclient.so';
{$ENDIF}
{$IFDEF OSX}
CLIENTNAME = 'libfbclient.dylib';
{$ENDIF}
...
fDBLink := TFDPhysFBDriverLink.create(nil);
fDBLink.vendorLib := IncludeTrailingPathDelimiter(extractFilePath(paramstr(0))) + CLIENTNAME;
В документации Embacadero сначала указывается, что исполняемый файл ищет в папке приложения, поэтому я также попытался не устанавливать expicit verndorLib - без разницы. Я также пробовал подпапку Contents/MacOS и родительскую папку, тоже без разницы.
Поскольку я не очень привык к платформе Unix, я понятия не имею, существуют ли системные команды, которые могут помочь выяснить, почему (!) Firedac не может загрузить библиотеку.
ОБНОВЛЕНИЕ 1
Тем временем я обнаружил, что создал экземпляр объекта TFDPhysFBDriverLink с каждым экземпляром базы данных, что привело к тому, что путь VendorLib был обнаружен как пустой в FDDriver. После исправления сообщение об ошибке содержит полный путь к libfbclient.dylib, и я убедился, что он действительно там живет. Я выполнил отладку в коде Firedac, где библиотека загружается с помощью LoadLibrary
: путь правильный, и все же он возвращает 0 в OSX.
Наконец я решил это.
Проблема, оставшаяся после исправления пути VendorLib, похоже, связана с зависимостью libtommath.dylib. Проверка libfbclient.dylib с помощью otool -L
показывает выполненные зависимости от файлов, находящихся в стандартных папках и одной специальной:
@rpath/lib/libtommath.dylib
Насколько мне известно, rpath по умолчанию — это путь, по которому находится исполняемый файл, поэтому я попробовал этот подход:
VendorLib
TFDPhysFBDriverLink на новый путь (включая /lib)Это прекрасно работает и является решением, которое легко реализовать. В Linux эта проблема не возникала, так как одной из моих зависимостей при установке является пакет libtommath.