此处必须分清几件事情:
- 有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构建而来,但使用其他操作系统下的任何内容。
很好的解释...我使用CentOS x86-64,带有gcc编译器。我编译时需要针对32位Linux和64位Linux(所以我可以为两种架构提供产品)。我不知道我的代码的用户有哪些特定的CPU,所以我认为我必须是非常通用的。 –
如果你有CentOS x86-64,那么你的编译器会为AMD64平台生成代码。我不使用CentOS,所以无法确定,但尝试编译器是否接受'-m32'。如果确实如此,那对你有好处,没有别的可以做。如果没有_not_,则必须安装32位交叉编译器的RPM(可同时安装两个编译器),并在Code :: Blocks(重复,然后编辑)中配置新的编译器设置,使用交叉编译器的正确可执行文件名(它们将被命名为'gcc-centos-i586'或类似名称,请查看'/ usr/bin'以确定确切的名称) – Damon