Xbox 360/Xbox 在 Mac 上的开发
本文档介绍了配置 iBook 以编译使用 OpenXDK 编写的 C 代码并制作 Xbox 原生可执行文件的过程。在撰写本文时,作者已成功编译了 Windows 可执行文件,但尚未能够将其转换为 Xbox 可执行文件。
所有这些步骤都相当直观,尽管新手需要了解一些技巧来避开数小时的“谷歌搜索”。该过程类似于在 Linux 上安装 OpenXDK,但有所不同,因为在本例中我们使用的是 PowerPC 处理器。这意味着我们首先必须构建一个交叉编译器。假设您知道如何访问 shell。
DarwinPorts 是一种简单地跟踪和安装开源程序到您的系统中的方法。它专为 Darwin 设计(顾名思义),使用它您可以下载 MingGW。当前版本的 DarwinPorts 是 1.2,它提供了一个方便的安装程序包。安装后,运行以下命令以更新内部可用端口列表
- $ sudo port -d selfupdate
MingGW 编译器和 Windows API 库允许您编写和编译程序以在 i386 系统上执行。虽然您可以从网站下载您需要的任何内容的副本,但使用 DarwinPorts 为您下载正确的文件是一个更好的选择。要下载所需的工具,请运行以下命令
- $ sudo port install i386-mingw32-gcc
这将下载、配置并安装 gcc 交叉编译器和工具到您的系统中。注意:此步骤将花费一段时间。
在撰写本文时,安装程序为 binutils 包执行 make 时会发生编译错误。确切的错误列在下面
- $.../work/binutils-2.15.91-20040904-1/gas/config/tc-i386.h:457: error: array type has incomplete element type
要解决此问题,请在准备构建时将编译器更改为 gcc-3.3。
- $ sudo gcc_select 3.3
然后,一旦 binutils 包成功编译,请停止安装(Ctrl+C)(安装无论如何都会失败)并将编译器改回 gcc-4.0。然后安装应该成功完成。
这是一个可选步骤。我只是通过编写一个 Hello World!程序并在我的 Windows 机器上运行它来测试设置是否有效。hello.c 的内容如下所示
#include <stdio.h>
int main(int argc, char **argv)
{
printf ("Hello\n");
return 0;
}
然后编译,就像普通的 gcc/++ 一样
$ i386-mingw32-gcc -o hello.exe hello.c
这会生成一个 Windows 可执行文件 hello.exe,它可以在 Windows 中本地运行。请注意,这仅测试交叉编译器设置,而不是 OpenXDK。
OpenXDK 是一个用于开发将在 Xbox 上运行的应用程序的免费工具包。它包含一个完整的 libc 替换,使用 SDL 进行多媒体(声音和网络目前不支持)并使用 gcc 编译。
您可以从 SourceForge 下载最新版本。确保下载二进制文件 OpenXDK_#_bin.zip(其中 # 是版本)。注意:尽管它说它适用于 i386 平台,但那是我们的目标系统,OpenXDK 不会(即使使用 i386-mingw32-gcc)在 Mac 上编译。
Cxbe 与 OpenXDK 一起提供,位于 bin 目录中。它负责将 Windows 可执行文件转换为 Xbox 可执行文件。您将无法使用提供的那个,因为它适用于 Windows。
不幸的是,在撰写本文时,OpenXDK_src 包中的 Cxbe 源代码版本比 OpenXDK_bin 包中编译的版本旧。在出现解决方法之前,我们将不得不将半完成的可执行文件发送到 Windows 机器并在那里运行 Cxbe。
要编译为 xBox 编写的 C 代码,您需要一个冗长的编译器标志列表。以下是根据 OpenXDK 网站 调整的。这假设您在系统上有一个有效的 cxbe 版本。
- # 已安装的 OpenXDK 路径
- XDK = /usr/local/openXDK
- # 交叉编译器
- CC = i386-mingw32-gcc
- # cxbe 路径(用于后处理)
- CXBE = $(XDK)/bin/cxbe
- SDLFLAGS = -DENABLE_XBOX -DDISABLE_CDROM
- CC_FLAGSA = -g -std=gnu99 -ffreestanding -nostdlib -fno-builtin
- CC_FLAGSB = -fno-exceptions -mno-cygwin -march=i386 $(SDLFLAGS)
- INCLUDE = -I$(XDK)/i386-pc-xbox/include -I$(XDK)/include -I$(XDK)/include/SDL
- CLINK = -nostdlib
- ALIGN = -Wl,--file-alignment,0x20 -Wl,--section-alignment,0x20
- SHARED = -shared
- ENTRYPOINT = -Wl,--entry,_WinMainCRTStartup
- STRIP = -Wl,--strip-all
- LD_FLAGS = $(CLINK) $(ALIGN) $(SHARED) $(ENTRYPOINT) $(STRIP)
- LD_DIRS = -L$(XDK)/i386-pc-xbox/lib -L$(XDK)/lib
- LD_LIBS = $(LD_DIRS) -lSDL -lopenXDK -lhal -lc -lhal -lc -lusb -lxboxkrnl
- all: default.exe
- *.o: *.c
- $(CC) $(CC_FLAGSA) $(CC_FLAGSB) $(INCLUDE) $<
- default.exe: *.o
- $(CC) -c $< -o $@ $(LD_LIBS) $(LD_FLAGS)
- $(CXBE) -TITLE:"$@" -DUMPINFO:"default.cxbe" -OUT:"default.xbe" $@ >/dev/null
- clean
- rm -f *.o *.xbe *.cxbe *.exe
虽然 Mac 上对 Xbox 开发的支持有限,但由于使用 Linux 开发合法的 Xbox 可执行文件,并且 Mac OS X 是基于 Unix 的变体构建的,因此有可能搭载 Linux 的支持资源,并(经过稍微修改)产生一个可行的解决方案来进行 Mac Xbox 开发。