Delphi OSX Catalina 上的 10.4 Firedac 错误 314
Delphi 10.4 Firedac Error 314 on OSX Catalina
如何在 OSX 中为 运行ning Firedac/Firebird 正确提供 libfbclient.dylib 以避免因此消息(此处为德语)而崩溃:
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
的位置:路径正确并且仍然是 returns 0 in OSX.
终于解决了
修复 VendorLib 路径后剩下的问题似乎是 libtommath.dylib 依赖项。使用 otool -L
检查 libfbclient.dylib 显示标准文件夹和一个特殊文件夹中的文件已完成依赖:
@rpath/lib/libtommath.dylib
据我所知,rpath 默认是可执行文件所在的路径,所以我尝试了这种方法:
- 为我与我的应用程序捆绑在一起的动态库创建一个子文件夹 lib
- 在子文件夹 lib
中部署 libfbclient.dylib 和 libtommath.dylib
- 将 TFDPhysFBDriverLink 的
VendorLib
更改为新路径(包括 /lib)
这很好用,而且是一个易于实施的解决方案。在 Linux 中,这个问题没有出现,因为我的安装依赖项之一是 libtommath 包。
如何在 OSX 中为 运行ning Firedac/Firebird 正确提供 libfbclient.dylib 以避免因此消息(此处为德语)而崩溃:
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
的位置:路径正确并且仍然是 returns 0 in OSX.
终于解决了
修复 VendorLib 路径后剩下的问题似乎是 libtommath.dylib 依赖项。使用 otool -L
检查 libfbclient.dylib 显示标准文件夹和一个特殊文件夹中的文件已完成依赖:
@rpath/lib/libtommath.dylib
据我所知,rpath 默认是可执行文件所在的路径,所以我尝试了这种方法:
- 为我与我的应用程序捆绑在一起的动态库创建一个子文件夹 lib
- 在子文件夹 lib 中部署 libfbclient.dylib 和 libtommath.dylib
- 将 TFDPhysFBDriverLink 的
VendorLib
更改为新路径(包括 /lib)
这很好用,而且是一个易于实施的解决方案。在 Linux 中,这个问题没有出现,因为我的安装依赖项之一是 libtommath 包。