在Linux系统上运行Windows程序时,很多用户都会遇到一个头疼的问题:有些老软件只提供32位版本,而新开发的软件又可能仅支持64位。这就好比你同时需要螺丝刀和扳手,但工具箱里只有其中一种工具。Wine的WoW64(Windows 32-bit on Windows 64-bit)特性就是为了解决这个兼容性问题而生的。
我刚开始接触Wine时,就遇到过32位老版财务软件和64位设计工具无法同时运行的尴尬。后来发现,标准的Wine安装要么只能跑32位程序,要么只能跑64位程序。直到学会了构建支持WoW64的Wine环境,才真正实现了"鱼与熊掌兼得"。
WoW64的工作原理其实很巧妙。它通过在64位环境中嵌入32位兼容层,就像给64位系统装了个"翻译器"。当32位程序运行时,这个兼容层会自动处理32位到64位的转换工作。在Windows系统中,这个特性是原生支持的,而在Linux上,我们需要通过特殊编译的Wine来实现类似功能。
在开始编译之前,我们需要确保系统环境准备就绪。我建议使用Ubuntu 20.04 LTS或更新版本,因为这个发行版的软件仓库比较完善,能减少依赖问题的困扰。首先检查系统架构:
bash复制uname -m
如果输出是x86_64,说明你的系统是64位的,可以继续。如果是i386或i686,那就只能编译32位Wine了。
接下来更新系统软件包:
bash复制sudo apt update && sudo apt upgrade -y
这个步骤很重要,我遇到过因为系统组件版本过低导致编译失败的情况。有一次就因为gcc版本太旧,折腾了半天才发现问题所在。
Wine的编译需要完整的开发工具链。执行以下命令安装基本编译工具:
bash复制sudo apt install build-essential git -y
然后安装Wine编译所需的依赖库。这里有个小技巧:可以一次性安装所有可能需要的依赖,避免后续反复安装:
bash复制sudo apt install libx11-dev libfreetype6-dev libgl1-mesa-dev libglu1-mesa-dev \
libsdl2-dev libfontconfig-dev libxinerama-dev libxcursor-dev libxi-dev \
libxrandr-dev libxcomposite-dev libxdamage-dev libxml2-dev libxslt1-dev \
libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libopenal-dev \
libpulse-dev libudev-dev libvulkan-dev libasound2-dev libjpeg-dev \
libpng-dev libtiff-dev libdbus-1-dev libcups2-dev libsane-dev \
libgphoto2-dev liblcms2-dev libpcap-dev libusb-1.0-0-dev libkrb5-dev \
libsasl2-dev libldap2-dev libcapi20-dev libcups2-dev libgsm1-dev \
libmpg123-dev libopencl-dev libosmesa6-dev libpcap-dev libpcsclite-dev \
libv4l-dev libxkbcommon-dev libxrender-dev ocl-icd-opencl-dev -y
这些依赖看起来很多,但都是确保Wine各种功能正常运作所必需的。我曾经为了省事只安装部分依赖,结果编译出来的Wine无法运行某些特定程序,不得不重新来过。
首先创建两个独立的工作目录,分别用于32位和64位编译:
bash复制mkdir -p ~/wine-build/{wine32,wine64}
这种目录结构是我经过多次实践总结出来的最佳方案。把两个架构的编译分开进行,但放在同一个父目录下,既方便管理又符合Wine的编译要求。
接下来获取Wine源码。可以从官网下载稳定版,但我更推荐使用Git获取最新开发版:
bash复制git clone git://source.winehq.org/git/wine.git ~/wine-source
cd ~/wine-source
获取源码后,我们需要在两个目录中都放置完整的源码副本:
bash复制cp -r ~/wine-source/* ~/wine-build/wine32/
cp -r ~/wine-source/* ~/wine-build/wine64/
这样做的原因是两个架构的编译过程会生成不同的中间文件,混在一起容易造成冲突。我曾经尝试过共用一个源码目录,结果编译到一半就报错了。
首先编译64位版本:
bash复制cd ~/wine-build/wine64
./configure --enable-win64
这个--enable-win64参数是关键,它告诉编译系统我们要构建64位版本的Wine。配置过程中,系统会检查各种依赖是否满足。如果看到缺少某些库的错误信息,需要先安装对应的开发包。
配置成功后,开始编译:
bash复制make -j$(nproc)
这里的-j$(nproc)参数表示使用所有可用的CPU核心并行编译,可以显著加快编译速度。在我的8核机器上,完整编译大约需要30-60分钟,具体时间取决于硬件性能。
64位编译完成后,就可以开始32位版本的编译了。首先需要安装32位的开发库:
bash复制sudo apt install gcc-multilib g++-multilib \
libx11-dev:i386 libfreetype6-dev:i386 libgl1-mesa-dev:i386 \
libglu1-mesa-dev:i386 libsdl2-dev:i386 libfontconfig-dev:i386 \
libxinerama-dev:i386 libxcursor-dev:i386 libxi-dev:i386 \
libxrandr-dev:i386 libxcomposite-dev:i386 libxdamage-dev:i386 \
libxml2-dev:i386 libxslt1-dev:i386 libgstreamer-plugins-base1.0-dev:i386 \
libgstreamer1.0-dev:i386 libopenal-dev:i386 libpulse-dev:i386 \
libudev-dev:i386 libasound2-dev:i386 libjpeg-dev:i386 \
libpng-dev:i386 libtiff-dev:i386 libdbus-1-dev:i386 \
libcups2-dev:i386 libsane-dev:i386 libgphoto2-dev:i386 \
liblcms2-dev:i386 libpcap-dev:i386 libusb-1.0-0-dev:i386 \
libkrb5-dev:i386 libsasl2-dev:i386 libldap2-dev:i386 \
libcapi20-dev:i386 libcups2-dev:i386 libgsm1-dev:i386 \
libmpg123-dev:i386 libopencl-dev:i386 libosmesa6-dev:i386 \
libpcap-dev:i386 libpcsclite-dev:i386 libv4l-dev:i386 \
libxkbcommon-dev:i386 libxrender-dev:i386 -y
然后进入32位目录开始配置:
bash复制cd ~/wine-build/wine32
./configure --with-wine64=../wine64
这里的--with-wine64参数指向之前编译好的64位目录,这是实现WoW64功能的关键。它会让32位Wine知道在哪里能找到64位的支持库。
配置完成后,同样使用多核编译:
bash复制make -j$(nproc)
编译完成后,我们需要将两个版本的Wine安装到系统中。这里有两种安装方式:
第一种是直接安装到系统目录(需要root权限):
bash复制cd ~/wine-build/wine64
sudo make install
cd ../wine32
sudo make install
第二种是安装到自定义目录,适合不想污染系统目录的情况:
bash复制mkdir -p ~/wine-install
cd ~/wine-build/wine64
make DESTDIR=~/wine-install install
cd ../wine32
make DESTDIR=~/wine-install install
无论采用哪种方式,都要确保两个架构安装到同一个目标目录下。我曾经犯过错误,把32位和64位安装到了不同目录,结果WoW64功能完全无法工作。
安装完成后,可能需要调整PATH环境变量,确保系统能找到新安装的Wine:
bash复制export PATH=$PATH:/usr/local/bin
如果你选择了自定义安装目录,还需要设置WINEPREFIX:
bash复制export WINEPREFIX=~/.wine
为了让这些设置永久生效,可以把它们添加到~/.bashrc或~/.profile文件中。
安装完成后,可以通过以下命令验证WoW64功能是否正常:
bash复制wine --version
wine64 --version
两个命令应该分别输出32位和64位Wine的版本信息。更进一步的测试可以尝试运行不同架构的Windows程序:
bash复制wine notepad.exe # 应该使用32位模式运行
wine64 notepad.exe # 应该使用64位模式运行
在编译过程中,可能会遇到各种错误。最常见的是缺少依赖库。如果configure阶段报错,仔细阅读错误信息,通常它会明确指出缺少哪个开发包。
例如,如果看到"OpenGL development files not found"的错误,就需要安装对应的开发包:
bash复制sudo apt install libgl1-mesa-dev
对于32位编译,记得安装对应的i386版本:
bash复制sudo apt install libgl1-mesa-dev:i386
即使成功编译安装了支持WoW64的Wine,某些Windows程序可能仍然无法正常运行。这时候可以尝试以下方法:
bash复制WINEPREFIX=~/.wine-new wine setup.exe
bash复制winecfg
在"Applications"标签页中,可以为特定程序设置不同的Windows版本兼容模式。
为了获得更好的性能,可以考虑以下优化措施:
bash复制export WINEDEBUG=-all
bash复制sudo apt install libd3dadapter9-mesa-dev
然后在winecfg的"Graphics"标签页中启用"Gallium Nine"选项。
bash复制export WINEESYNC=1
在实际使用中,我们可能需要同时维护多个Wine版本。可以使用工具如winetricks来管理:
bash复制sudo apt install winetricks
winetricks --self-update
然后可以为不同程序创建独立的Wine前缀:
bash复制WINEPREFIX=~/.wine-program1 winecfg
WINEPREFIX=~/.wine-program2 winecfg
如果你需要将编译好的Wine环境分发给其他机器,可以考虑打包成AppImage或Flatpak格式。这里以简单的tar打包为例:
bash复制cd ~/wine-install
tar czvf wine-wo64-build.tar.gz .
在其他机器上解压后,只需设置PATH环境变量指向bin目录即可使用。
为了简化重复编译过程,可以创建自动化脚本。下面是一个简单的示例:
bash复制#!/bin/bash
# 安装依赖
sudo apt update
sudo apt install -y build-essential git
# 创建目录结构
mkdir -p ~/wine-build/{wine32,wine64}
git clone git://source.winehq.org/git/wine.git ~/wine-source
# 编译64位
cp -r ~/wine-source/* ~/wine-build/wine64/
cd ~/wine-build/wine64
./configure --enable-win64
make -j$(nproc)
# 编译32位
cp -r ~/wine-source/* ~/wine-build/wine32/
cd ~/wine-build/wine32
./configure --with-wine64=../wine64
make -j$(nproc)
# 安装
cd ~/wine-build/wine64
sudo make install
cd ../wine32
sudo make install
将这个脚本保存为build-wine.sh,然后赋予执行权限:
bash复制chmod +x build-wine.sh
./build-wine.sh