使用Code::Blocks编译时针对不同的CPU进行优化——理解错误

4

我正在使用Code::Blocks开发一个C应用程序,并需要针对多个平台(32位、64位)进行目标定位。我的开发环境是64位的,所以我尝试在项目设置中为编译器勾选i386(-march=i386)选项。现在当我编译时,会出现以下错误信息:

mainc:1: error: CPU you selected does not support x86-64 instruction set

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

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

1个回答

3
你需要区分以下几点:
  • 有32位和64位“平台”可以在同一处理器上运行。相同的X86-64处理器可以在x86或AMD64模式下运行,这决定了可用寄存器的数量、大小、堆栈布局、不同的调用约定以及一些不同的操作码(还要注意,在许多操作系统中,32位代码将在64位操作系统中的某种兼容性层中运行,不会出现问题)
  • 有针对任一平台的编译器,也有可以生成两者之一的编译器(但不能同时生成两者)。
  • 编译器可以与程序构建的平台不同(所谓的交叉编译器,例如在开发嵌入式系统时非常常见,但您也可以从Linux-64交叉编译为Windows-32,或从Win32计算机编译为Win64)。
  • 除了平台外,还有生成代码的特定于模型的差异(-march开关)。这决定了假定哪个处理器代数,从而确定可以在生成代码中使用哪些指令。并非每种平台和架构的组合都是有效的(这就是您的问题所在:假设25年前的386处理器意味着它不可能在AMD64模式下运行)。
  • 可选地,您甚至可以为不同于生成代码的东西进行调度。例如,您可以生成使用Pentium III指令的代码,但对Core i7进行调度。这将在几乎每个处理器上运行(次优地,但它会运行),并在最新系列上运行得最佳。
  • 最后,还有许多开关,如-msse家族,可进一步启用/禁用指令。

您没有指定“Windows”或“Linux”或其他任何内容,因此很难给出确切的答案,但假设您可能正在使用MingW-w64等编译器。该编译器允许您创建32位和64位代码,具体取决于您告诉它要做什么。显然,如果您告诉它以64模式生成代码(默认!),那么i386不是一个好选择。如果您在命令行选项中给它-m32,则它将生成32位代码,并且它将起作用。

如果您告诉我们您使用的编译器的确切信息,可能会有更具体的答案。例如,在Windows上,Code::Blocks附带TDM 4.5.1版本(可选),但在其他操作系统下使用任何可用的编译器。


如果您使用的是CentOS x86-64,则编译器将为AMD64平台生成代码。我不使用CentOS,所以无法确定,但请尝试是否编译器接受“-m32”。如果是这样,那就太好了,不需要做其他事情。如果不是,您必须安装32位交叉编译器的RPM(可以同时安装两个编译器),并在Code::Blocks中配置新的编译器设置(复制,然后编辑),使用正确的可执行文件名称来设置交叉编译器(它们的名称类似于gcc-centos-i586或类似的名称,请确保在/usr/bin中查看确切的名称)。 - Damon

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