有没有办法把Delphi的.dcu文件转换成.obj文件,这样它就可以用像GCC这样的编译器连接起来?我已经有几年没有使用Delphi了,但如果可能的话,我想在项目中再次使用if。
发布于 2010-09-13 03:10:17
Delphi可以输出.obj文件,但它们是在Intel OMF的32位变体中。另一方面,GCC使用ELF (Linux,大多数Unixes)、COFF (在Windows上)或Mach-O (Mac)。
但仅有这一点是不够的。如果不使用运行时库,就很难编写大量代码,并且运行时库的实现将依赖于编译器和链接器体系结构的低层细节,例如正确的初始化顺序。
此外,兼容性不仅仅是目标文件格式;尤其是Linux上的代码需要独立于位置,这意味着它不能使用绝对值来引用全局符号,而是必须索引来自寄存器或相对于指令指针的所有全局数据,以便代码可以在内存中重新定位,而不需要重写引用。
DCU文件是为每个proc生成的Delphi符号表和代码的序列化,因此高度依赖于编译器的实现细节,编译器的实现细节从一个版本到下一个版本不同。
这就是说,您不太可能将大量的Delphi (dcc32)代码链接到GNU环境中,除非您将自己限制为非托管数据类型(无字符串、无接口)和过程性代码(无类、无初始化节、无需要初始化的数据等)的绝对最少。
发布于 2010-09-13 02:19:26
发布于 2010-09-14 12:50:16
(回答各种FPC评论,但我需要更多空间)
为了更好地理解,你必须知道一个delphi转换成两个不同的FPC文件,一个是带有上述符号的.ppu文件,其中包括不可链接的代码,如内联函数和泛型定义,以及一个在Windows上兼容( .dcu )的.o。Cygwin在链接层上也是mingw兼容的(但运行时是不同的和可怕的)。无论如何,mingw32/64是我们在Windows上的参考资料,gcc。
PPU与Delphi的DCU有类似的版本问题,可能是出于相同的原因。ppu格式几乎每个主要版本都是不同的。(SO2.0、2.2、2.4),并且通常每年在主干中更改2-3次
所以,虽然Windows上的FPC使用自己的汇编器和链接器,但它生成的.o文件仍然与mingw32兼容。一般来说,FPC的输出与gcc非常兼容,并且通常可以直接链接到gcc的静态库中,允许例如mysql和postgres链接库通过合适的许可证链接到应用程序中。(例如GPL)在64位上它们也应该是兼容的,但这可能比win32测试得少。
文本模式IDE甚至以库的形式链接到整个GDB调试器中。GDB是gcc兼容Windows的主要原因之一。
虽然Barry关于运行时的观点通常也适用于FPC,但解决这个问题可能会稍微容易一些。它可能只需要调用某些函数来从您的启动代码初始化FPC rtl,类似地,finalize也是如此。使用-al编译一个最小的FPC程序,并查看生成的汇编程序(在.s文件中,最明显的是initializeunit和finalizeunit)此外,RTL更灵活,可能更容易减少到最小。
当然,一旦你还需要异常才能在gcc<->fpc边界上工作,你就不走运了。FPC不使用SEH或任何与其他ATM兼容的方案。(与Delphi相反,Delphi使用SEH,这至少在理论上应该给你带来优势,Barry?)OTOH,gcc可能会用自己的libunwind来代替SEH。
请注意,x86上FPC的默认调用约定是Delphi兼容寄存器,因此您可能需要插入适当的cdecl (应该是与gcc兼容的)修饰符,甚至可以使用{$calling cdecl}一次为整个单元设置它。
在*nix上这是bog标准(例如apache模块),我不知道很多人在win32上这样做。
关于兼容性;FPC可以编译像Indy,Teechart,Zeos,ICS,Synapse,VST和更多的软件包,只需要很少的mods或没有mods。发布版本的方言级别是D7和up的混合,重点是D7。在主干版本中,方言级别正在慢慢向D2006级别爬行。(使用for in、类抽象等)
https://stackoverflow.com/questions/3695946
复制相似问题