FPC没有为64位处理器定义CPU386符号

时间:2014-10-21 07:45:18

标签: delphi fpc

下一个申请

program Project1;

{$IFDEF FPC}
  {$mode delphi}
{$ENDIF}

begin
  {$IFDEF CPU386}
    Writeln('CPU386');
  {$ENDIF}
  Readln;
end.

在我的系统(Win7 64位,CPU intel core i3)上使用Delphi(XE)和FPC(2.6.2)生成不同的输出。 Delphi输出CPU386字符串,FPC不输出。

好像FPC没有为我的CPU定义CPU386符号(参见the list of FPC defines);它改为定义CPUX86_64符号。

到目前为止,我正在使用下一个解决方法:

{$IFDEF FPC}
  {$IFNDEF CPU386}
    {$IFDEF CPUX86_64}
      {$DEFINE CPU386}
    {$ENDIF}
  {$ENDIF}
{$ENDIF}

2 个答案:

答案 0 :(得分:2)

这是预期的。 CPU386条件适用于32位Intel x86目标。 CPUX86_64条件适用于64位Intel x64目标。

使用64位Delphi编译器编译程序时,它也不会产生任何输出。因为没有为64位Delphi编译器定义CPU386条件。

执行此操作不正确:

{$IFDEF CPUX86_64}
  {$DEFINE CPU386}
{$ENDIF}

CPU386表示目标架构是32位Intel x86。并且64位Intel x64不是。

预定义条件的Delphi文档位于:http://docwiki.embarcadero.com/RADStudio/en/Conditional_compilation_(Delphi)#Predefined_Conditionals

它列出了CPU标题下的以下内容:

  • CPUARM
  • CPU386
  • CPUX86
  • CPUX64

对于32位x86目标,Delphi和FPC都定义CPU386。对于64位x64目标,Delphi定义CPUX64,FPC定义CPUX86_64

如果您需要在共享源代码中使用常见条件,那么您可能需要做一些额外的工作。假设你选择CPUX86CPUX64。然后你会包括这个:

{$IFDEF FPC}
  {$IFNDEF CPU386}
    {$DEFINE CPUX86}
  {$ENDIF}
  {$IFNDEF CPUX86_64}
    {$DEFINE CPUX64}
  {$ENDIF}
{$ENDIF}

答案 1 :(得分:1)

最简单的方法是查看FPC的“fpc -va输出,看看(32位)FPC在i386上定义的内容:(2.6.0)

[0.002] Macro defined: CPU86
[0.002] Macro defined: CPU87
[0.002] Macro defined: CPU386
[0.002] Macro defined: CPUI386
[0.002] Macro defined: CPU32

64位编译器定义:(2.7.1,手头没有发布版本)

[0.004] Macro defined: CPUX86_64
[0.004] Macro defined: CPUAMD64
[0.004] Macro defined: CPU64
[0.004] Macro defined: CPUX64
很可惜Delphi没有选择兼容的定义。由于x86_64架构已经多次重命名,因此FPC定义了几个。

注意btw CPU32和CPU64用于一般32/64位切换。将此用于仅影响指针大小但不特定于x86的任何内容。虽然最初主要是为了在英特尔和PowerPC之间进行抽象,但 64位ARM 将会再次出现这个问题。

cpui386和cpux86_64用于真正针对特定处理器的更改。

这些定义的手册是here