当我的目标是 64 位 arch. 时,我是否需要交叉编译我的程序?主机是 x86 系列的 32 位 arch?

当我的目标是 64 位 arch. 时,我是否需要交叉编译我的程序?主机是 x86 系列的 32 位 arch?

我的主机是
:x86 32 位处理器
我的目标是:x86 64 位处理器

我有一些问题 :

  • 我想知道是否可以使用可用的 gcc 在主机中简单地编译一个程序并在目标上运行它?
  • 我需要为 x86 64 位处理器交叉编译它吗?如果是的话,我如何在编译时指定它?
  • 我需要使用单独的工具链来交叉编译程序吗?

答案1

所有 amd64(即 64 位 x64)处理器都可以运行 32 位 x86 二进制文件。此外,在大多数操作系统上,您可以在 amd64 操作系统上运行 x86 程序。因此,通常可以在 amd64 处理器上部署 x86 二进制文件。

是否愿意这样做是另一回事。 64 位操作系统通常附带一组受限制的 32 位库,因此如果您的程序使用一些不常见的库,则安装 64 位可执行文件会更容易。根据您的应用程序,32 位或 64 位二进制文​​件可能有也可能没有性能优势。

如果您决定部署 64 位可执行文件,则需要一个针对在 x86 架构上运行的 amd64(又名 x86_64)架构的交叉编译环境。这意味着要链接的编译器和静态库。

gcc 安装可以共享前端并包含多个后端。但没有多少发行版在 x86 平台上附带 amd64 开发工具,因此您可能必须拥有自己的工具(gcc 的交叉编译相当简单)。对于要链接的库也是如此(当然,一旦有了编译器,就可以从源代码重新编译它们)。

例如,x86 上的 Ubuntu 10.04 附带了“multilib”版本的 gcc 和 amd64 后端,以及一小组 64 位开发包(libc6-dev-amd64 安装 libc6-dev-amd64 http://bit.ly/software-small以及依赖和依赖包)。

答案2

是的,您可以:只需指定正确的编译器选项即可。您将无法在 32 位主机上运行生成的二进制文件。

我认为您需要: CFLAGS=-m64 您还需要设置 LD_LIBRARY_PATH 以及类似于您的依赖项的 64 位标头和库。

stackoverflow 有一个问题有更多答案。

相关内容