【发布时间】:2020-12-22 18:25:26
【问题描述】:
我如何正确提供 libfbclient.dylib 以在 OSX 中运行 Firedac/Firebird 以避免因此消息而崩溃(此处为德语):
EFDException: [FireDAC][Phys][FB]-314. Laden der Herstellerbibliothek [libfbclient.dylib or libfbembed.dylib] nicht möglich.
为了避免一些预先的问题:我正在编译的软件已经在 Windows 和 Linux 上运行良好,在 OSX 中它只是找不到 libfbclient.dylib。此外,所有与数据库无关的单元测试在所有三个平台上都运行良好。我确保 dylib 像可执行文件一样具有 64 位,我从同一台 Mac 上的全新 firebird 3 安装中获取它们。该项目是一个应用服务器(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 文档首先说明了应用程序文件夹中的可执行搜索,所以我也尝试省略设置显式 verndorLib - 没有区别。我也尝试了子文件夹 Contents/MacOS 和父文件夹,也没有区别。
由于我不太习惯 Unix 平台,我不知道是否有系统命令可以帮助找出原因(!)Firedac 无法加载库。
更新 1
同时我发现我用每个数据库实例实例化了一个 TFDPhysFBDriverLink 对象,这导致 VendorLib 路径在 FDDriver 中被检测为空。更正后,错误消息包含 libfbclient.dylib 的完整路径,我验证它确实存在于那里。我调试了 Firedac 代码到库加载的位置LoadLibrary:路径是正确的,但它在 OSX 中仍然返回 0。
【问题讨论】: