☰
Madeira 兼容层实战:FEX-Emu、Wine 与 DXMT 跨平台运行指南
2026/10/1 6:25:16 网站建设 项目流程

1. 从“Madeira”说起:这个项目到底在折腾什么

第一次看到“Madeira”这个名字,很多人会以为是某个旅游项目或者葡萄酒品牌。但如果你混过模拟器、兼容层、跨平台运行这几个圈子,就会知道这背后其实是一整套围绕FEX-Emu、Wine、DXMT构建的 x86-64 应用在非 x86 平台上的运行方案。简单说,它想解决的问题是:我手里有一堆为 Windows 和 x86-64 架构编译的软件、游戏、工具,但我现在用的设备可能是 ARM 架构的,或者系统本身不是 Windows,怎么让这些东西跑起来,而且跑得尽量稳、尽量快。

这个标题下面挂着的热词非常杂:FEX-Emu、Wine、DXMT、iOS、x86-64,还有一堆关于 wine 乱码、麒麟 wine 助手、统信 wine 兼容组件、iOS 开发者模式、Xcode 上架流程、iOS 自动化、iOS 分屏、银行模拟器 iOS 等等。看起来像是把“跨平台兼容运行”和“iOS 开发/使用”两条线揉在了一起。实际上,这两条线在“Madeira”这个项目里是有交集的:一端是让 x86-64 的 Windows 程序在 ARM 设备上跑起来,另一端是 iOS 生态里各种开发、调试、安装、上架、自动化的琐碎问题。

我先把话说清楚:这篇不是官方文档,也不是什么“从入门到精通”的教程。它更像是一个折腾了很久的人,把自己踩过的坑、试过的方案、最后跑通的路子整理出来。适合谁看?如果你正在 ARM 设备上尝试运行 x86-64 的 Windows 软件,或者你是一个 iOS 开发者/重度用户,被开发者模式、证书、上架、WebView 播放、通知横幅这些东西搞得头大,那这篇内容应该能帮你省下不少搜索时间。

“Madeira”本身可以理解为一个兼容层组合方案的代称:底层用 FEX-Emu 做 x86-64 到 ARM64 的指令翻译,中间用 Wine 提供 Windows API 兼容环境,图形层再用 DXMT 把 Direct3D 调用翻译成 Metal,从而在 Apple 芯片设备上跑 Windows 游戏和软件。这个组合不是唯一解,但它是目前社区里讨论比较多、迭代比较快的一条路线。下面我会把每个环节拆开讲,包括为什么这么选、怎么配、哪里容易翻车。

2. 核心组件拆解:FEX-Emu、Wine、DXMT 各自扮演什么角色

2.1 FEX-Emu:把 x86-64 指令“翻译”成 ARM64 能听懂的话

FEX-Emu 是一个开源的 x86-64 到 ARM64 的模拟/翻译层。它的核心思路不是像传统模拟器那样一条指令一条指令地解释执行,而是做动态二进制翻译:把 x86-64 的指令块翻译成 ARM64 的指令块,然后缓存起来重复使用。这样做的好处是,第一次执行某段代码时会有翻译开销,但后续重复执行同一段代码时速度会接近原生。

为什么在“Madeira”里需要它?因为很多 Windows 软件和游戏只发布了 x86-64 版本,没有 ARM64 版本。如果你用的是 Apple 芯片的 Mac、或者某些 ARM 架构的 Linux 设备,这些程序本身是跑不起来的。FEX-Emu 就是那个“翻译官”,让 CPU 能理解原本不认识的指令。

实际使用中,FEX-Emu 的配置有几个关键点。第一是RootFS,也就是一个包含 x86-64 库和基础环境的文件系统镜像。没有它,FEX-Emu 不知道去哪里找 x86-64 的动态链接库。第二是Thunking,也就是把一些图形、音频、输入相关的调用直接转发给宿主系统的原生库,避免在模拟环境里再模拟一遍。第三是JIT 缓存,翻译结果会缓存到磁盘上,下次启动会快很多。

注意:FEX-Emu 的 RootFS 版本要和 FEX-Emu 主程序版本匹配,否则会出现库找不到或者符号不兼容的问题。我试过用旧版 RootFS 配新版 FEX-Emu,结果 Wine 启动直接报错,排查了半天才发现是版本对不上。

2.2 Wine:不是模拟器,是 API 翻译层

Wine 的全称是“Wine Is Not an Emulator”,它做的事情是把 Windows 的系统调用翻译成宿主系统(比如 Linux 或 macOS)能理解的调用。它不模拟 CPU 指令,所以它必须和 FEX-Emu 配合使用:FEX-Emu 负责 CPU 指令翻译,Wine 负责 Windows API 翻译。

在“Madeira”方案里,Wine 通常是以Wine64的形式运行在 FEX-Emu 的 RootFS 里面。也就是说,你启动的是一个 x86-64 的 Wine,它以为自己在一个 x86-64 的 Linux 环境里,但实际上底层指令是被 FEX-Emu 翻译过的。

Wine 的配置有几个绕不开的坑。首先是Wineprefix,也就是模拟的 Windows 目录结构。每个 prefix 可以独立配置 Windows 版本、DLL 覆盖、注册表等。如果你要跑多个软件,建议一个软件一个 prefix,避免 DLL 冲突。其次是Winetricks,用来安装一些 Windows 运行库,比如 .NET、Visual C++ 运行库、DirectX 组件等。很多软件跑不起来,不是 Wine 本身的问题,而是缺了某个运行库。

关于热词里提到的“wine 乱码”和“wine 栏是乱码”,这通常是字体问题。Wine 默认的字体配置可能不包含中文字形,导致菜单栏、对话框里的中文显示成方块或者乱码。解决办法是安装中文字体,然后在 Wine 注册表里把默认字体替换成中文字体。具体操作后面会讲。

2.3 DXMT:把 Direct3D 翻译成 Metal

DXMT 是一个把 Direct3D 11/12 调用翻译成 Metal 的项目。在 Apple 芯片设备上,Metal 是原生的图形 API,性能最好。如果没有 DXMT,Wine 里的 Direct3D 调用可能会走 OpenGL 或者 Vulkan 转译,性能和兼容性都会打折扣。

DXMT 在“Madeira”里的位置是:Wine 收到游戏的 Direct3D 调用,然后通过 DXMT 转发给 Metal,最终由 GPU 执行。这个链路比原生 Windows 多了一层翻译,所以性能损失是必然的,但好的实现可以把损失控制在可接受范围内。

实际使用中,DXMT 需要和 Wine 的版本匹配,也需要正确的 DLL 覆盖配置。通常需要把d3d11.dll、dxgi.dll等文件替换成 DXMT 提供的版本。如果配置不对,游戏可能会黑屏、闪退或者报“找不到 d3d11.dll”。

2.4 三者如何协同:一个简化的数据流

假设你启动一个 Windows 游戏,整个流程大致是这样的:

  1. 你执行启动脚本,FEX-Emu 加载 x86-64 的 Wine 可执行文件。
  2. Wine 读取 prefix 配置,加载游戏的主程序。
  3. 游戏调用 Direct3D 创建渲染设备,Wine 把调用转给 DXMT。
  4. DXMT 把 Direct3D 调用翻译成 Metal 调用,交给 Apple GPU 执行。
  5. 游戏的输入、音频等调用由 Wine 转发给宿主系统的原生接口。

这个链路里任何一环出问题,游戏都跑不起来。所以排查问题时要一层一层看:FEX-Emu 能不能跑简单的 x86-64 程序?Wine 能不能启动记事本?DXMT 能不能渲染简单的 Direct3D 测试程序?每一步都确认了,再上复杂的游戏。

3. 实操环境搭建:从零开始把“Madeira”跑起来

3.1 硬件与系统前提

“Madeira”方案主要面向 Apple 芯片的 Mac(M1/M2/M3/M4 系列),因为 FEX-Emu 和 DXMT 在 macOS 上的适配相对成熟。系统版本建议 macOS 13 或更高,低版本可能会有 Metal API 缺失的问题。内存建议 16GB 起步,因为 FEX-Emu 的翻译缓存、Wine 的 prefix、游戏本身都会吃内存。硬盘空间至少留 50GB,RootFS、Wine prefix、游戏安装目录加起来很容易超过这个数。

如果你用的是 ARM 架构的 Linux 设备,理论上也可以跑,但 DXMT 的 Metal 后端就用不了了,得换别的图形翻译方案。这篇主要按 macOS 路线讲,Linux 路线只在必要处提一下。

3.2 获取 FEX-Emu 和 RootFS

FEX-Emu 的官方发布渠道会提供 macOS 的二进制包和对应的 RootFS。下载时注意看版本号,主程序和 RootFS 要配套。解压后你会得到一个包含FEX可执行文件和RootFS目录的结构。

RootFS 通常是一个压缩包,解压后里面是一个完整的 Linux 文件系统,包含/usr/lib/x86_64-linux-gnu等目录。你需要把这个 RootFS 放到 FEX-Emu 能找得到的位置,通常是通过环境变量FEX_ROOTFS指定。

export FEX_ROOTFS=/path/to/RootFS export PATH=/path/to/FEX:$PATH

然后可以跑一个简单的测试:

FEX /path/to/RootFS/usr/bin/uname -m

如果输出x86_64,说明 FEX-Emu 已经能正常翻译 x86-64 指令了。这一步很关键,如果这里就报错,后面的 Wine 和 DXMT 都不用试了。

3.3 在 RootFS 里配置 Wine

RootFS 里通常已经包含了 Wine,但版本可能比较旧。你可以用 RootFS 里的包管理器更新,或者手动下载新版 Wine 的 x86-64 二进制包放进去。

配置 Wine 的第一步是创建 prefix:

export WINEPREFIX=/path/to/your/prefix FEX /path/to/RootFS/usr/bin/wineboot -u

wineboot -u会初始化 prefix,创建drive_c、注册表等。如果这一步卡住或者报错,通常是 RootFS 里缺了某些库,或者 FEX-Emu 的配置有问题。

初始化完成后,可以跑一个简单的 Windows 程序测试:

FEX /path/to/RootFS/usr/bin/wine notepad

如果记事本窗口能弹出来,说明 Wine 基本可用了。如果弹不出来,看终端输出,通常是缺 DLL 或者图形驱动没配好。

3.4 配置 DXMT

DXMT 的安装通常是把编译好的d3d11.dll、dxgi.dll、d3d10core.dll等文件复制到 Wine prefix 的drive_c/windows/system32目录,然后在 Wine 注册表里设置 DLL 覆盖,让 Wine 优先加载这些原生 DLL。

具体步骤:

  1. 下载 DXMT 的发布包,解压得到 DLL 文件。
  2. 复制到$WINEPREFIX/drive_c/windows/system32/。
  3. 运行winecfg,在“函数库”标签页里把d3d11、dxgi等设置为“原生”优先。
FEX /path/to/RootFS/usr/bin/winecfg

配置完成后,可以跑一个 Direct3D 测试程序,比如dxdiag,看看能不能正确识别渲染设备。如果dxdiag里显示的是 Metal 相关的设备信息,说明 DXMT 已经生效了。

3.5 安装和运行目标软件

把 Windows 软件的安装包放到 prefix 能访问的目录,然后运行安装程序:

FEX /path/to/RootFS/usr/bin/wine /path/to/installer.exe

安装完成后,用类似的方式启动主程序。如果软件需要特定的运行库,可以用 Winetricks 安装:

FEX /path/to/RootFS/usr/bin/winetricks dotnet48 vcrun2019

这里要注意,Winetricks 本身是一个脚本,它会在 RootFS 里下载和安装东西,所以 RootFS 需要能访问网络,或者你提前把安装包缓存好。

4. 常见问题与排查技巧实录

4.1 Wine 中文乱码怎么修

这是热词里出现频率很高的问题。Wine 默认的字体替换表里,中文字体可能映射到了不存在的字体,导致中文显示为方块或乱码。解决办法分两步:

第一步,把中文字体复制到 Wine 的字体目录:

cp /path/to/your/chinese/font.ttf $WINEPREFIX/drive_c/windows/Fonts/

第二步,修改注册表,把默认字体替换成中文字体。可以创建一个.reg文件:

REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes] "Arial"="Noto Sans CJK SC" "Tahoma"="Noto Sans CJK SC" "MS Shell Dlg"="Noto Sans CJK SC" "MS Shell Dlg 2"="Noto Sans CJK SC"

然后导入:

FEX /path/to/RootFS/usr/bin/wine regedit /path/to/font.reg

重启 Wine 程序后,中文应该就能正常显示了。如果还有个别地方乱码,可能是那个程序自己带了字体文件,需要单独替换。

4.2 游戏黑屏或闪退

黑屏和闪退的原因很多,按概率从高到低排:

  • DXMT 没配好:检查d3d11.dll和dxgi.dll是否在 system32 里,DLL 覆盖是否设置正确。
  • 缺运行库:用 Winetricks 装vcrun2019、dotnet48、d3dcompiler_47等。
  • FEX-Emu 版本不匹配:RootFS 和主程序版本不一致会导致奇怪的崩溃。
  • 游戏本身的反作弊或 DRM:有些游戏有反作弊系统,在模拟环境里会被检测为异常,直接拒绝运行。这种基本无解,除非游戏官方支持。

排查时建议开 Wine 的调试输出:

WINEDEBUG=+d3d11,+dxgi FEX /path/to/RootFS/usr/bin/wine game.exe

看终端里哪一步报错,然后针对性解决。

4.3 性能调优的几个关键参数

FEX-Emu 和 DXMT 都有一些影响性能的参数。FEX-Emu 这边,可以调整 JIT 缓存大小和翻译线程数。DXMT 这边,可以调整 Metal 的命令队列数量和着色器缓存策略。

实际调优时,我一般先跑一个基准测试,记录帧率,然后逐个调整参数,看哪个参数对帧率影响最大。不要一次改一堆参数,否则出了问题不知道是哪个引起的。

另外,macOS 的 Game Mode 对性能有影响,建议开启。还有,关闭后台不必要的应用,尤其是那些吃 GPU 的,能明显提升帧率稳定性。

4.4 常见问题速查表

问题现象可能原因排查方法解决方向
Wine 启动报错找不到库RootFS 不完整或版本不匹配检查FEX_ROOTFS路径和版本重新下载配套 RootFS
中文显示为方块字体缺失或替换表不对检查 Fonts 目录和注册表安装中文字体并修改替换表
游戏黑屏DXMT 未生效跑dxdiag看渲染设备检查 DLL 覆盖和文件位置
游戏闪退缺运行库或反作弊开WINEDEBUG看报错装运行库或放弃该游戏
帧率过低翻译开销大或 GPU 瓶颈跑基准测试,调参数调 JIT 缓存、关后台应用
音频爆音或无声Wine 音频驱动配置问题检查winecfg音频设置切换音频驱动或装组件

5. iOS 侧的那些事儿:开发者模式、证书、上架与自动化

5.1 iOS 开发者模式到底怎么开

热词里反复出现“ios开发者模式”“ios 26.3.1怎么开发者模式”,说明很多人卡在这一步。iOS 16 之后,开发者模式默认是隐藏的,需要先安装一个开发者证书或者用 Xcode 连接一次设备,才能在设置里看到“开发者模式”选项。

具体操作:用数据线把 iPhone 连到 Mac,打开 Xcode,在“Window > Devices and Simulators”里找到你的设备。Xcode 会提示需要开启开发者模式,按照提示在 iPhone 上进入“设置 > 隐私与安全性 > 开发者模式”,打开开关,然后重启手机。重启后会有确认弹窗,确认即可。

如果设置里找不到“开发者模式”,说明设备还没有被 Xcode 识别过。可以尝试重新连接、信任电脑、或者用 Apple Configurator 激活一下。

5.2 免费证书与 Xcode 打包上架流程

免费证书只能用于开发和真机调试,不能上架 App Store。上架需要付费开发者账号(个人或公司)。从证书配置到上架的完整流程大致是:

  1. 在 Apple Developer 后台创建 App ID,配置 Bundle ID 和所需能力。
  2. 创建发布证书(Distribution Certificate)和描述文件(Provisioning Profile)。
  3. 在 Xcode 里配置签名,选择对应的 Team 和描述文件。
  4. Archive 打包,上传到 App Store Connect。
  5. 在 App Store Connect 里填写元数据、截图、隐私政策等。
  6. 提交审核,等待通过。

常见坑点:证书过期、描述文件不匹配、Bundle ID 冲突、隐私政策缺失、截图尺寸不对。Xcode 打包突然变慢,通常是网络问题或者缓存问题,可以清理 DerivedData 再试。

5.3 iOS WebView 不能自动播放怎么办

热词里有一条“抖音 ios webview 不能自动播放”,这是 iOS 的默认策略:WebView 里的音视频自动播放需要用户手势触发,或者需要设置playsinline和muted属性。如果是在自己的 App 里嵌 WebView,可以在WKWebViewConfiguration里设置mediaTypesRequiringUserActionForPlayback为[],允许自动播放。但注意,App Store 审核可能会对自动播放有额外要求,尤其是涉及广告的时候。

5.4 仿 iOS 通知横幅与自动化

“notification banner 仿 ios 通知横幅”这个需求通常出现在跨平台 App 或者网页里,想模仿 iOS 的通知样式。实现思路是用 CSS 做圆角、毛玻璃背景、阴影,然后用 JavaScript 控制滑入滑出动画。关键是要处理好安全区域(safe area)和不同屏幕尺寸的适配。

iOS 自动化方面,可以用快捷指令(Shortcuts)做很多重复性操作,比如自动连接 Wi-Fi、自动发送消息、自动截图等。如果快捷指令不够用,可以用 Xcode 写一个简单的 App,调用XCUITest做 UI 自动化测试。再复杂一点,可以用pymobiledevice3这类工具做设备管理自动化。

6. 一些踩坑之后的个人体会

折腾“Madeira”这套方案,最大的感受是:版本匹配比什么都重要。FEX-Emu、RootFS、Wine、DXMT、macOS 系统版本,这五个东西只要有一个版本对不上,就可能出现各种奇怪的问题。我建议你在升级任何一个组件之前,先备份当前能用的配置,然后一次只升一个,确认没问题再升下一个。

另一个体会是,不要指望所有 Windows 软件都能跑。有些软件依赖特定的硬件驱动、反作弊系统、或者内核级组件,这些在模拟环境里基本无解。与其花几个小时折腾一个跑不起来的软件,不如先查查社区里有没有人成功跑过。如果没有人成功过,大概率你也跑不起来。

最后,日志是你的朋友。Wine 的WINEDEBUG、FEX-Emu 的日志、DXMT 的日志,这些输出虽然看起来很烦,但里面往往藏着解决问题的关键线索。学会看日志,比到处问人效率高得多。

至于 iOS 那边,开发者模式和证书配置是绕不过去的门槛,但一旦配好了,后面就是重复劳动。上架流程看起来复杂,其实按部就班走一遍就熟了。WebView 自动播放和通知横幅这些,都是细节问题,查文档基本都能解决。

这个内容后续还可以这样扩展:比如把 FEX-Emu 换成其他 x86-64 翻译方案做对比测试,或者把 DXMT 换成 Vulkan 转译方案看性能差异。如果你对某个环节特别感兴趣,可以顺着那个方向深挖,社区里相关的讨论和项目其实不少。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询