64位Delphi目标文件能否静态链接到编译好的C对象文件?

14

我的32位Delphi 2010应用程序使用$LINK编译指令链接到一些C对象文件。如果我要将目标指向64位,我可以在Delphi XE2中这样做吗?

我目前正在使用bcc32版本5.5进行编译,但是如果Embarcadero C编译器还没有输出64位对象,我不介意使用其他编译器。


3
我曾在某处读到,你可以在一个64位的Delphi应用程序中链接由MS VC++创建的COFF对象文件(作为.obj文件)。 - Warren P
1
@Rudy 已经发货了。ELF 对于 Windows 不好。 - David Heffernan
这里是一个免费试用的链接:https://downloads.embarcadero.com/free/rad_studio - LU RD
@LU 我打算购买这个产品,但我想知道答案。 - David Heffernan
@downvoter 如果不是静态链接,$LINK 是什么? - David Heffernan
显示剩余4条评论
2个回答

34

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

值得注意的另一点是,虽然Delphi 64位可以链接到COFF对象文件(最终还将支持ELF64),但32位Delphi支持与C ++ Builder生成的OMF对象文件链接,以及新的XE2,32位COFF对象文件,它可以使用MSVC ++构建。适用相同的注意事项。


非常感谢您回复,Allen。 这正是我想要听到的。 我想最终我即将回到南非。 如果可以,请再问一个问题,您知道 gcc/mingw 是否生成可以被 Delphi 使用的对象吗? - David Heffernan
6
值得一提的是,System.Win.Crtl.pas单元提供了链接许多基本C运行时例程所需的支持,当链接.obj文件时这些例程是必须的。该单元是RTL包的一部分。在使用之前,请查看源文件中的注释/免责声明/警告。 :) - Mark Edington
1
关于OBJ格式(例如,如果您问为什么相同的文件扩展名可能有几种格式),请参见http://agner.org/optimize网站。该网站经常更新,包含许多有趣的材料,特别是关于64位和跨平台。甚至还有一个在COFF / OMF格式之间转换的工具,以及一些跨平台反编译器。 - Arnaud Bouchez

3

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接