【问题标题】:Delphi 10.4 Firedac Error 314 on OSX CatalinaOSX Catalina 上的 Delphi 10.4 Firedac 错误 314
【发布时间】: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。

【问题讨论】:

    标签: macos delphi firebird


    【解决方案1】:

    终于解决了。

    修复 VendorLib 路径后遗留的问题似乎是 libtommath.dylib 依赖项。使用 otool -L 检查 libfbclient.dylib 显示了对标准文件夹中的文件和一个特殊文件夹中的文件的完全依赖:

    @rpath/lib/libtommath.dylib 
    

    据我所知,rpath 默认是可执行文件所在的路径,所以我尝试了这种方法:

    • 为我与应用程序捆绑的 dylib 创建一个子文件夹 lib
    • 在子文件夹 lib 中部署 libfbclient.dylib 和 libtommath.dylib
    • 将 TFDPhysFBDriverLink 的 VendorLib 更改为新路径(包括 /lib)

    这很好用,是一个易于实施的解决方案。在 Linux 中,这个问题没有出现,因为我的安装依赖项之一是 libtommath 包。

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多