(对各种FPC评论的回答,但我需要更多空间)
为了更好地理解,您必须知道 delphi .dcu 转换为两个不同的 FPC 文件,.ppu 文件与提到的 symtable 内容,其中包括不可链接的代码,如内联函数和通用定义和一个 .o Windows 上的 mingw 兼容 (COFF)。 Cygwin 在链接级别上也与 mingw 兼容(但运行时不同且可怕)。无论如何,mingw32/64 是我们在 Windows 上的参考 gcc。
PPU 与 Delphi 的 DCU 有类似的版本问题,原因可能相同。 ppu 格式几乎在每个主要版本中都不同。 (所以 2.0、2.2、2.4),并且通常每年在后备箱中更改 2-3 次
因此,虽然 Windows 上的 FPC 使用自己的汇编器和链接器,但它生成的 .o 仍然与 mingw32 兼容。一般而言,FPC 的输出与 gcc 非常兼容,通常可以直接链接 gcc 静态库,例如mysql 和 postgres 链接库链接到具有合适许可证的应用程序。 (例如 GPL)在 64 位上它们也应该兼容,但这可能比 win32 测试得少。
textmode IDE 甚至以库的形式链接到整个 GDB 调试器。 GDB 是 Windows 上 gcc 兼容的主要原因之一。
虽然 Barry 关于运行时的观点通常也适用于 FPC,但解决这个问题可能会稍微容易一些。它可能只需要调用某些函数来从您的启动代码初始化 FPC rtl,并且类似地用于 finalize。使用 -al 编译一个最小的 FPC 程序并查看生成的汇编程序(在 .s 文件中,最显着的是 initializeunits 和 finalizeunits)此外,RTL 更灵活,可能更容易减少到最低限度。
当然,一旦您还需要例外以跨 gccfpc 边界工作,那么您就不走运了。 FPC 不使用 SEH,或任何与其他 ATM 兼容的方案。 (与使用 SEH 的 Delphi 相反,Barry 至少在理论上应该给你一个优势?) OTOH,gcc 可能会使用它自己的 libunwind 而不是 SEH。
请注意,x86 上 FPC 的默认调用约定是与 Delphi 兼容的寄存器,因此您可能需要插入适当的 cdecl(应该与 gcc 兼容)修饰符,甚至可以使用 {$calling 一次为整个单元设置它cdecl}
在 *nix 上这是沼泽标准(例如 apache 模块),但我不知道有多少人在 win32 上这样做。
关于兼容性; FPC 可以编译 Indy、Teechart、Zeos、ICS、Synapse、VST 等软件包
并且很少或没有 mods 更多。已发布版本的方言级别是 D7 及以上的混合级别,重点是 D7。在主干版本中,方言级别正在缓慢攀升至 D2006 级别。 (with for in, class abstract 等)