Delphi 10.4 Firedac Ошибка 314 на OSX Catalina

Как мне правильно предоставить 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.

Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
242
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец я решил это.

Проблема, оставшаяся после исправления пути VendorLib, похоже, связана с зависимостью libtommath.dylib. Проверка libfbclient.dylib с помощью otool -L показывает выполненные зависимости от файлов, находящихся в стандартных папках и одной специальной:

@rpath/lib/libtommath.dylib 

Насколько мне известно, rpath по умолчанию — это путь, по которому находится исполняемый файл, поэтому я попробовал этот подход:

  • создать подпапку lib для dylibs, которые я связываю с моим приложением
  • разверните libfbclient.dylib и libtommath.dylib в подпапке lib
  • измените VendorLib TFDPhysFBDriverLink на новый путь (включая /lib)

Это прекрасно работает и является решением, которое легко реализовать. В Linux эта проблема не возникала, так как одной из моих зависимостей при установке является пакет libtommath.

Другие вопросы по теме