无法在 Ubuntu 20.04.2 LTS 上编译超级马里奥 64
Can't compile Super Mario 64 on Ubuntu 20.04.2 LTS
我在编译这个 github repo for Super Mario 64 时遇到了问题。我遵循了所有步骤。
- 我确保我安装了所有依赖项,例如 build essential
- 我克隆了 repo 并复制了一个 rom 用于资产提取
- 我使用了 运行ning
make VERSION=us -j4
的 Makfile
编译器做了它的事情并给出了一些预期的警告,但它没有给出任何错误并表示 sha1 校验和匹配。当我进入构建目录并尝试执行 sm64.us.bin 时,它给出了这个错误:bash: ./sm64.us.bin: cannot execute binary file: Exec format error
。当我用谷歌搜索这个错误时,我发现有些人在尝试 运行 64 位 OS 上的 32 位二进制文件时得到了它,但这不可能,因为我是 运行 在 64 位机器上安装 64 位内核并自己编译。我检查了权限位,那里似乎没有任何问题。我什至尝试删除 repo 并再次克隆它,但没有用。然后我尝试 运行ning 不同的标志,如 -j5 或完全没有 -j 标志(这应该没有什么区别,因为我 运行ning 一个相当活泼的 12 核 Ryzen 5 但我想我我会尝试让 GCC 在单个内核上编译,因为我 运行 没有想法)。我在这里做错了什么?是否有我应该更改的 GCC 设置,或者 makefile 是否有问题?
更新:
我检查了 ELF 文件,由于某种原因它看起来像是 32 位的。我 运行 file sm64.us.elf
并且输出是 sm64.us.elf: ELF 32-bit MSB executable, MIPS, MIPS-III version 1 (SYSV), statically linked, not stripped
。为什么海湾合作委员会这样做?如何编译 64 位可执行文件?
GCC 可以构建 32 位或 64 位可执行文件(在大多数系统上)。这完全取决于你给出的论据。如果您查看 make 是 运行ning 的编译调用,您可能会看到它传递了 -m32
(或一些类似的)选项,该选项告诉编译器和链接器创建 32 位对象和二进制文件。
如果您想构建 64 位,则必须在您的 makefile 或其他配置中找到 select 32 位的参数,然后删除它们(或更改它们以明确选择 64 位)。
我应该警告你,这几乎肯定行不通!!并不是任何旧的 C 程序都可以编译为 32 位或 64 位并继续工作同样地。 可能,但这样做需要程序员仔细和深思熟虑地编写代码。根据我的经验,视频游戏程序几乎总是专门针对给定的硬件目标进行编码,很少考虑使其可移植到其他硬件,其中包括“同一”供应商的 64 位版本。
与其尝试为 64 位构建代码,更好地利用您的时间是调查为什么您的系统无法 运行 32 位可执行文件并修复它。对我来说很奇怪,你可以为 32 位编译但不能为 运行 32 位编译:通常如果你可以构建它,那么你就有适当的库等安装到 运行.
我在编译这个 github repo for Super Mario 64 时遇到了问题。我遵循了所有步骤。
- 我确保我安装了所有依赖项,例如 build essential
- 我克隆了 repo 并复制了一个 rom 用于资产提取
- 我使用了 运行ning
make VERSION=us -j4
的 Makfile
编译器做了它的事情并给出了一些预期的警告,但它没有给出任何错误并表示 sha1 校验和匹配。当我进入构建目录并尝试执行 sm64.us.bin 时,它给出了这个错误:bash: ./sm64.us.bin: cannot execute binary file: Exec format error
。当我用谷歌搜索这个错误时,我发现有些人在尝试 运行 64 位 OS 上的 32 位二进制文件时得到了它,但这不可能,因为我是 运行 在 64 位机器上安装 64 位内核并自己编译。我检查了权限位,那里似乎没有任何问题。我什至尝试删除 repo 并再次克隆它,但没有用。然后我尝试 运行ning 不同的标志,如 -j5 或完全没有 -j 标志(这应该没有什么区别,因为我 运行ning 一个相当活泼的 12 核 Ryzen 5 但我想我我会尝试让 GCC 在单个内核上编译,因为我 运行 没有想法)。我在这里做错了什么?是否有我应该更改的 GCC 设置,或者 makefile 是否有问题?
更新:
我检查了 ELF 文件,由于某种原因它看起来像是 32 位的。我 运行 file sm64.us.elf
并且输出是 sm64.us.elf: ELF 32-bit MSB executable, MIPS, MIPS-III version 1 (SYSV), statically linked, not stripped
。为什么海湾合作委员会这样做?如何编译 64 位可执行文件?
GCC 可以构建 32 位或 64 位可执行文件(在大多数系统上)。这完全取决于你给出的论据。如果您查看 make 是 运行ning 的编译调用,您可能会看到它传递了 -m32
(或一些类似的)选项,该选项告诉编译器和链接器创建 32 位对象和二进制文件。
如果您想构建 64 位,则必须在您的 makefile 或其他配置中找到 select 32 位的参数,然后删除它们(或更改它们以明确选择 64 位)。
我应该警告你,这几乎肯定行不通!!并不是任何旧的 C 程序都可以编译为 32 位或 64 位并继续工作同样地。 可能,但这样做需要程序员仔细和深思熟虑地编写代码。根据我的经验,视频游戏程序几乎总是专门针对给定的硬件目标进行编码,很少考虑使其可移植到其他硬件,其中包括“同一”供应商的 64 位版本。
与其尝试为 64 位构建代码,更好地利用您的时间是调查为什么您的系统无法 运行 32 位可执行文件并修复它。对我来说很奇怪,你可以为 32 位编译但不能为 运行 32 位编译:通常如果你可以构建它,那么你就有适当的库等安装到 运行.