2011-10-04 34 views
4

我正在使用Code :: Blocks开发一个C应用程序,并且需要针对多个平台(32位,64位)。我的开发框是64位的,所以我试图在项目设置中检查编译器的i386(-march = i386)选项。现在,当我编译:当使用Code :: Blocks编译时定位不同的CPU - 理解错误

mainc:1:错误:您选择了不支持X86-64运算指令集CPU

  1. 我不明白这条消息!通过指定i386不应该只是生成x86指令(不是-64)?除此之外,我的CPU是X86-64,为什么说我的CPU不支持这个?

  2. 我这样做是错误的吗?有针对不同架构的正确方法吗?

回答

3

此处必须分清几件事情:

  • 有32位和64位 “平台”,关于相同处理器上运行。相同的X86-64处理器可以在 x86或AMD64模式下运行。除此之外,这还决定了可用寄存器的数量,它们的大小,堆栈布局,不同的调用约定和一些不同的操作码(另请注意,在许多操作系统中,32位代码将在64位操作系统的某种兼容层中运行,而无问题)
  • 的编译器,其中一个这些平台,并且有编译器可以生成或者两个(但不能同时)。
  • 编译器可以是与程序构建的不同平台(所谓的交叉编译器,非常常见的事情,例如为嵌入式系统开发时,但也可以交叉编译用于Windows-32从Linux -64或其他方式,或在Win32计算机上为Win64编译)。
  • 除了平台,生成的代码(-march开关)中还有一个模型特定的差异。这决定了什么样的处理器代码,它决定了什么指令可以用于生成代码。并非所有平台和体系结构的组合都是有效的(这是你的问题:假设一个25岁的386处理器意味着它不可能在AMD64模式下运行)。
  • 或者,您甚至可以安排与您生成代码不同的内容。例如,您可以生成使用Pentium III指令的代码,但计划使用Core i7。这将在几乎每个处理器上运行(次优,但它会运行),并且在最新的生产线上优化运行。
  • 最后,还有许多开关,如-msse系列,它们进一步启用/禁用指令。

您没有指定“Windows”或“Linux”或其他任何东西,所以很难对您的问题给出确切的答案,但让我们假设您可能正在使用例如MingW-w64。该编译器允许您创建32位和64位代码,具体取决于您所做的操作。显然,如果你告诉它在64模式下生成代码(默认!),那么i386不是一个好的选择。如果你将它作为命令行选项-m32,它将生成32位代码,并且它将工作。

如果你告诉究竟是你使用的是什么编译器,它可能有助于找到更具体的答案。例如,Code :: Blocks(可选)随Windows上的TDM 4.5.1构建而来,但使用其他操作系统下的任何内容。

+0

很好的解释...我使用CentOS x86-64,带有gcc编译器。我编译时需要针对32位Linux和64位Linux(所以我可以为两种架构提供产品)。我不知道我的代码的用户有哪些特定的CPU,所以我认为我必须是非常通用的。 –

+0

如果你有CentOS x86-64,那么你的编译器会为AMD64平台生成代码。我不使用CentOS,所以无法确定,但尝试编译器是否接受'-m32'。如果确实如此,那对你有好处,没有别的可以做。如果没有_not_,则必须安装32位交叉编译器的RPM(可同时安装两个编译器),并在Code :: Blocks(重复,然后编辑)中配置新的编译器设置,使用交叉编译器的正确可执行文件名(它们将被命名为'gcc-centos-i586'或类似名称,请查看'/ usr/bin'以确定确切的名称) – Damon

相关问题