2011-09-01 43 views
12

我的32位Delphi 2010应用程序使用$LINK编译器指令链接到多个C目标文件。在使用64位时,我可以在Delphi XE2中执行此操作吗?64位Delphi目标是否可以静态链接到已编译的C对象文件?

我目前正在编译使用bcc32版本5.5,但我不介意使用哪个编译器,如果事实证明Embarcadero C编译器尚未输出64位对象。

+3

我已经阅读过某个地方,你可以在64位Delphi应用程序中链接COFF目标文件(使用MS VC++创建为.obj文件)。 –

+1

@Rudy它已发货。 ELF对Windows没有好处。 –

+0

当然,您可以使用另一个可以发出64位COFF或任何您需要的编译器,也许是GNU或LLVM编译器之一? BCC v.5.5编译器是免费的,我猜?它已经有点老了,不是很标准。 –

回答

32

是的。您必须将“C”对象文件编译为COFF格式。这通常意味着英特尔和/或MSVC++编译器。同样的注意事项适用于适用于32位的64位目标文件链接。您必须确保所有外部引用都已正确解析,或者通过提供另一个具有该符号的.obj或Delphi代码。在构建“C”代码时,确保禁用任何堆栈检查或其他运行时验证代码生成。很多时候,这种代码依赖于给定工具的特定版本的C/C++ RTL。

别的东西值得一提的是,虽然德尔福64位可以链接到COFF目标文件(最终它还将支持ELF64),32位的Delphi支持与C++ Builder的链接构建OMF对象文件,新XE2,32位可以使用MSVC++构建的COFF目标文件。同样的注意事项适用。

+0

非常感谢你回复艾伦,这正是我想听到的。我想最后我要回到南非了。如果你喜欢,还有一个问题,你知道gcc/mingw是否产生了可以被Delphi使用的对象吗? –

+6

另外值得一提的是,System.Win.Crtl.pas单元提供了对链接到.obj文件时需要的许多基本C运行时例程的链接支持。这个单元是RTL包的一部分。使用前请参阅源文件中的注释/免责声明/警告。 :) –

+1

关于OBJ格式(例如,如果您问为什么相同的文件扩展名可能有多种格式),请参阅http://agner.org/optimize站点。它经常更新,包含很多有趣的资料,特别是关于64位和跨平台的。 COFF/OMF格式之间甚至还有一个转换器,以及一些跨平台的反编译器。 –

3

是的,您可以链接到64位XE2项目中的OBJ文件,但OBJ文件必须是64位代码。

+0

你知道对象需要什么格式以及哪些编译器可以生成它们吗? –

+0

@大卫:见艾伦的答案。 –

相关问题