Wine是Linux下一款比较出色的运行Windows应用的工具。不过如果我们直接用apt install
安装,那么只能安装很旧的版本。在此我想分享一下我编译安装Wine的过程。
说在前面的是,Wine分为32位和64位,一般我们用的是wine32位,因为大多数Windows程序还是32位的,32位Wine只能运行32位应用,64位Wine只能运行64位应用。与此同时还可以编译具有WoW64特性的Wine,也就是既能运行32位应用也可以运行64位应用的,这个在下面会分别讲述。
个人推荐使用Debian 12 64位系统进行编译。
下面开始吧!
1,下载Wine源码并解压
去Wine官网下载源码并解压。
2, 安装编译Wine必须的依赖库
(1) 依赖简述
编译Wine源码必须要安装一些依赖库来执行编译和一些功能软件包来完善Wine的功能,否则无法编译。在官方文档的构建部分中,可以看到全部所需依赖的表格,表格中包含了包名、依赖用途等等。其中并不是所有的库都需要,不过能安装的我们可以都安装了,以备不时之需。
(2) 一键安装命令
为了方便起见,这里提供一键安装所有依赖的命令如下,打开终端输入下列命令安装所有必须的依赖包(这里给出Debian 12
和Ubuntu 22.04.1
的一键安装依赖命令,其它系统大同小异):
Debian 12 64位:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install flex bison make gcc-multilib gcc-mingw-w64 libasound2-dev libasound2-dev:i386 libpulse-dev libpulse-dev:i386 libdbus-1-dev libdbus-1-dev:i386 libfontconfig-dev libfontconfig-dev:i386 libfreetype-dev libfreetype-dev:i386 libgnutls28-dev libgnutls28-dev:i386 libgl-dev libgl-dev:i386 libunwind-dev libunwind-dev:i386 libx11-dev libx11-dev:i386 libxcomposite-dev libxcomposite-dev:i386 libxcursor-dev libxcursor-dev:i386 libxfixes-dev libxfixes-dev:i386 libxi-dev libxi-dev:i386 libxrandr-dev libxrandr-dev:i386 libxrender-dev libxrender-dev:i386 libxext-dev libxext-dev:i386 libgstreamer1.0-dev libgstreamer1.0-dev:i386 libgstreamer-plugins-base1.0-dev libosmesa6-dev libosmesa6-dev:i386 libsdl2-dev libsdl2-dev:i386 libudev-dev libudev-dev:i386 libvulkan-dev libvulkan-dev:i386 libcapi20-dev libcapi20-dev:i386 libcups2-dev libcups2-dev:i386 libgphoto2-dev libgphoto2-dev:i386 libsane-dev libsane-dev:i386 libkrb5-dev libkrb5-dev:i386 samba-dev samba-dev:i386 ocl-icd-opencl-dev ocl-icd-opencl-dev:i386 libpcap-dev libpcap-dev:i386 libusb-1.0-0-dev libusb-1.0-0-dev:i386 libv4l-dev libv4l-dev:i386
Ubuntu 22.04.1 64位
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install flex bison make gcc-multilib gcc-mingw-w64 libasound2-dev libasound2-dev:i386 libpulse-dev libpulse-dev:i386 libdbus-1-dev libdbus-1-dev:i386 libfontconfig-dev libfontconfig-dev:i386 libfreetype-dev libfreetype-dev:i386 libgnutls28-dev libgnutls28-dev:i386 libgl-dev libgl-dev:i386 libunwind-dev libunwind-dev:i386 libx11-dev libx11-dev:i386 libxcomposite-dev libxcomposite-dev:i386 libxcursor-dev libxcursor-dev:i386 libxfixes-dev libxfixes-dev:i386 libxi-dev libxi-dev:i386 libxrandr-dev libxrandr-dev:i386 libxrender-dev libxrender-dev:i386 libxext-dev libxext-dev:i386 libgstreamer1.0-dev libgstreamer1.0-dev:i386 libgstreamer-plugins-base1.0-dev libgstreamer-plugins-base1.0-dev:i386 libosmesa6-dev libosmesa6-dev:i386 libsdl2-dev libsdl2-dev:i386 libudev-dev libudev-dev:i386 libvulkan-dev libvulkan-dev:i386 libcapi20-dev libcapi20-dev:i386 libcups2-dev libcups2-dev:i386 libgphoto2-dev libgphoto2-dev:i386 libsane-dev libsane-dev:i386 libkrb5-dev libkrb5-dev:i386 samba-dev ocl-icd-opencl-dev ocl-icd-opencl-dev:i386 libpcap-dev libpcap-dev:i386 libusb-1.0-0-dev libusb-1.0-0-dev:i386 libv4l-dev libv4l-dev:i386
(3) 常见依赖问题解决
① 依赖版本问题
一些系统安装时可能出现依赖版本问题,例如下列情况:
这是因为要安装的编译库自己所依赖的软件包的版本不对,可能是即将要被自动安装的依赖包版本太新或者本地计算机上面已经安装的相应的依赖库版本太新。(上图中的libfontconfig1-dev
依赖libfontconfig1
的2.11.0-6.7+b1
版本,libfreetype6-dev
依赖libfreetype6
的2.6.3-3.2
版本 )解决方法也很简单,把上面不对的软件包降级即可。
降级方法:
sudo apt install 包名=指定的包的版本号
那么就上图的情况而言,我就要通过下面的命令把libfontconfig1
和libfreetype6
分别降级至2.11.0-6.7+b1
版本和2.6.3-3.2
版本:
sudo apt install libfontconfig1=2.11.0-6.7+b1
sudo apt install libfreetype6=2.6.3-3.2
② dpkg
错误:Sub-process /usr/bin/dpkg returned an error code (1)
在Ubuntu系统上安装依赖时可能出现如下问题:
这时先执行下列命令修复:
sudo apt install -f
然后会遇到粘贴 子进程被信号(断开的管道) 终止了
的错误信息:
找到提示错误的安装包路径,进行强行覆盖安装,例如图中是/var/cache/apt/archives/krb5-multidev_1.19.2-2_amd64.deb
,则执行命令:
sudo dpkg -i --force-overwrite "/var/cache/apt/archives/krb5-multidev_1.19.2-2_amd64.deb"
然后再执行一次修复依赖命令:
sudo apt install -f
此时软件包就会继续正常安装,等待安装完成即可!
这样解决了编译库的依赖问题,再执行上述安装编译依赖库的命令即可正常安装所有依赖库了!
③ OSS
依赖
然后Linux自带的OSS(Open Sound System)版本较老,而Wine的编译和运行也会用到新版本的OSS(至少V4)(OSS也是非必须的,不安装新版本不影响Wine的编译和日常运行,但是推荐安装以丰富其功能),我们需要去OSS官网下载Linux的安装包,对应系统架构(32位还是64位,根据自己系统位数下载即可,不需要32位和64位的一起安装):
然后使用dpkg -i
命令安装即可,安装遇到任何错误也是执行sudo apt install -f
修复即可。
3,开始编译源码
需要说在前面的是,Wine即可以编译出单独的32位版本或者64位版本,也可以编译出32和64位兼具的版本(带有WoW64特性的)。单独的32位版本只能运行32位程序,单独的64位版本只能运行64位程序,且单独的32位版本和64位版本的Wine不可以合并共存,没有特殊需求只编译32位版本可以满足大多数需求(毕竟平常大多数程序都是32位的)。
当然编译32位和64位兼具的版本更加强大,因为编译完成的程序已经同时包含了Wine和Wine64,可以运行32位或者64位程序。
下面我将分别介绍这两种情况的编译方法,大家根据需求选择其中的一种即可。
(1) 编译单独的32/64位版本
解压了Wine源码之后。用cd
命令进入解压后的源码所在文件夹,依次执行:
./configure
make
这时默认编译的是32位的Wine。
如果你要编译64位的Wine,就执行:
./configure --enable-win64
make
然后就开始编译了。编译可能需要一个多小时才能完成,这个时候可以把它挂着,然后品一杯咖啡再回来。
当然如果说机器性能足够好,想要快速构建可以使用多线程编译,在make
命令时加上参数-j
,j
后面的数字代表你指定的线程数,例如:
make -j4
即为4线程编译。下面的make
命令都可以加上这个-j
参数多线程编译。
编译完成后,执行下列命令来安装:
sudo make install
或者可以通过下列命令把Wine安装至指定位置:
make DESTDIR=要安装到的文件夹(绝对路径) install
(2) 编译32位和64位兼具的Wine(包含WoW64特性)
首先我们建立两个文件夹,并把源码都解压到两个文件夹里,这两个文件夹分别编译32位和64位Wine源码,两个架构我们都需要编译。我这里在同一个目录下创建了wine32
,wine64
两个文件夹,并把源码都解压进去了。
先编译64位Wine,我这里命令行如下:
cd wine64
./configure --enable-win64
make
等待64位的编译完成,再去编译32位的Wine:
cd ../wine32
./configure --with-wine64=../wine64
make
可见编译32位Wine时通过--with-wine64
参数指定了已编译完成的Wine 64位的目录,这样编译32位Wine时,程序会注入64位版本处理32位程序所需的库。
等待全部编译完成之后,分别进入两个文件夹执行安装命令即可(指定了DESTDIR
参数指定安装目录的话,两次指定的安装目录必须相同):
# 默认安装
sudo make install
cd ../wine64
sudo make install
# 指定安装目录(两次指定的安装目录必须相同)
make DESTDIR=安装目录 install
cd ../wine64
make DESTDIR=安装目录 install
需要注意的是,两个文件夹都make
完成后,就不能修改两个文件夹的名称以及它们的相对位置了,否则在make install
32位的Wine时会导致找不到64位Wine的文件夹导致make install
命令失败。
这样就完成了整个过程了!输入wine
命令即可使用Wine。
若使用Wine的过程中出现了中文乱码,可参考这个教程:链接
也可以下载宋体字体文件(simsun.ttc
)并放到/usr/local/share/wine/fonts
目录下。
如果你把Wine安装到了别的路径(make install
时使用了DESTDIR
参数指定了安装目录),则你需要把宋体字体文件放到安装目录/usr/local/share/wine/fonts
目录下。
例如我把Wine安装到了/home/swsk33/app/wine
目录下,则我要把字体放到/home/swsk33/app/wine/usr/local/share/wine/fonts
目录下。
4,安装Wine Mono组件
Wine Mono是一款能够在Linux运行.NET程序的插件,在安装Wine后,运行Wine时会提示你安装。但是Wine的自动安装很慢,所以建议去官网下载Wine Mono程序文件并手动安装。
先去官网下载地址下载对应版本的Wine Mono,下载对应版本的msi
文件。
Wine Mono组件备用下载地址:传送门
下载msi
文件:
需要注意的是,Wine版本和Wine Mono版本必须对应,否则无法使用,对应列表可以在官方文档查看。
Mono的版本最好是和上表Wine版本对应。但是经过我的测试发现,对于某个版本的Mono,安装至比它的对应的Wine版本要高的Wine里面也是可以使用的(Wine向下兼容低版本Mono)。例如5.1.1
的Mono对应的是5.19
版本的Wine,但是5.1.1
版本的Mono安装到6.0
版本的Wine里面也可以使用。所以大家可以根据表来选择版本。
根据上表,得知我们Wine 5.11版本必须用Wine Mono的5.1.0
版本才行。
这里以下载5.1.0
版本Wine Mono为例,下载后是一个名为wine-mono-5.1.0-x86.msi
的文件。
- 如果你在使用
make install
安装Wine时未指定安装路径(默认安装),则你需要先在/usr/local/share/wine
目录下新建一个名为mono
的文件夹,然后把下载下来的wine-mono-5.1.0-x86.msi
放到mono
文件夹里面即可(/usr/local/share/wine/mono
下) - 如果安装时使用
DESTDIR
参数指定了安装路径,则需要在安装路径的/usr/local/share/wine
目录下新建一个名为mono
的文件夹,然后把下载下来的wine-mono-5.1.0-x86.msi
放到mono
文件夹里面即可(安装路径/usr/local/share/wine/mono
下)
例如我把Wine安装到了/home/swsk33/app/wine32
目录下,则我需要在/home/swsk33/app/wine32/usr/local/share/wine
目录下新建一个名为mono
的文件夹,然后把下载下来的wine-mono-5.1.0-x86.msi放到/home/swsk33/app/wine32/usr/local/share/wine/mono
下。
这样,Wine Mono组件就安装完成了!
5,安装Wine Gecko组件
Wine Gecko是用于HTML渲染的组件,也是一些应用运行所需要的。这个组件和Wine Mono安装方式基本相似。我们还是通过下载压缩包离线安装的形式安装。
还是先去官网下载地址下载msi
文件,选择相应的版本。
Wine Gecko组件备用下载地址:传送门
下载msi
文件(如果你是Wine 32位,那么只需要下载x86
的文件,如果是Wine 64位或者是WoW64的Wine,则需要下载x86_64
和x86
的两个文件):
和Wine Mono一样,也需要对应Wine版本下载,在官方的文档页面可以查看两者版本对应列表。
以我下载的wine-gecko-2.47.1-x86.msi
为例,(如果是64位Wine或者具有WoW64特性的Wine,你需要下载wine-gecko-2.47.1-x86.msi
和wine-gecko-2.47.1-x86_64.msi
两个文件)。
- 如果你在使用
make install
安装Wine时未指定安装路径(默认安装),则你需要先在/usr/local/share/wine
目录下新建一个名为gecko
的文件夹,然后把下载下来的wine-gecko-2.47.1-x86.msi
(64位或者具有WoW特性的Wine的话就是wine-gecko-2.47.1-x86.msi
和wine-gecko-2.47.1-x86_x64.msi
)放到gecko
文件夹里面即可(/usr/local/share/wine/gecko
下) - 如果安装时使用
DESTDIR
参数指定了安装路径,则需要在安装路径/usr/local/share/wine
目录下新建一个名为gecko
的文件夹,然后把下载下来的wine-gecko-2.47.1-x86.msi
(64位或者具有WoW特性的Wine的话就是wine-gecko-2.47.1-x86.msi
和wine-gecko-2.47.1-x86_x64.msi
)放到gecko
文件夹里面即可(安装路径/usr/local/share/wine/gecko
下)
例如我把Wine安装到了/home/swsk33/app/wine32
目录下,则我需要在/home/swsk33/app/wine32/usr/local/share/wine
目录下新建一个名为gecko
的文件夹,然后把下载下来的wine-gecko-2.47.1-x86.msi
放到/home/swsk33/app/wine32/usr/local/share/wine/gecko
下。
例如我安装的是64位Wine,且安装到了/home/swsk33/app/wine64
目录下,则我需要在/home/swsk33/app/wine64/usr/local/share/wine
目录下新建一个名为gecko
的文件夹,然后把下载下来的wine-gecko-2.47.1-x86.msi
和wine-gecko-2.47.1-x86_x64.msi
放到/home/swsk33/app/wine64/usr/local/share/wine/gecko
下。
这样,Wine Gecko组件就安装完成了!
安装完Wine Gecko和Wine Mono之后,再使用Wine就不会提示让你安装这两个组件了!
6,深度系统安装QQ,微信注意事项
现在Wine的高版本已经可以完美运行qq2020最新版了。不过最近几天研究发现:深度Linux的桌面环境和wine3.x及其以上版本存在兼容性问题,wine3.x版本运行的应用的托盘图标在深度上面点击无响应,以及稍微大型一点的程序常常假死除非打开虚拟桌面。
总结了这几天踩得坑,我个人认为,深度的用户要想正常使用qq,微信,我给出两点建议:
(1) 不使用官方的Wine,而是使用Deepin-Wine
Deepin-Wine是深度团队基于Wine 2.18版本改造的,更适合于国内软件,深度系统都集成了Deepin-Wine,无需另外安装。使用方法和Wine基本相似。
① QQ
先初始化创建并配置Wine容器:
deepin-wine winecfg
如果需要自定义Wine容器位置执行:
WINEPREFIX=指定Wine容器位置(绝对路径) deepin-wine winecfg
在出现的配置页面中,把系统设置成Windows XP(否则QQ会频繁崩溃,新版本QQ也可以不配置):
再点击上面的函数库标签页,在新增函数库顶替加入riched20
,riched32
和msvcp60
函数库,添加,应用:
最后再使用deepin-wine
命令执行QQ安装包即可。
打开QQ之后建议先不要急着去点,等它头像等数据加载完成再操作,否则可能造成崩溃!
② 微信
现在Deepin 20可以安装deepin-wine5,通过apt install
安装即可。建议新版deepin使用deepin-wine5可以更好地适配微信。
和安装QQ一样,也是先创建并配置容器,命令同上。
然后在dll-files搜索riched20.dll
和riched32.dll
下载,下载32位的。
DLL备用下载地址:传送门
下载后把riched20.dll
和riched32.dll
复制到Wine容器位置/drive_c/windows/system32
目录下覆盖原文件。
默认容器文件夹是用户文件夹里的.wine
,那么就复制到用户目录/.wine/drive_c/windows/system32
文件夹下。
如果使用了WINEPREFIX
参数定义了容器位置,那么就进入你定义的容器文件夹里面相应的地方,和上面类似。
然后再次运行配置(deepin-wine winecfg
,自定义容器位置的话记得前面加上WINEPREFIX=...
),像上面配置QQ的容器一样,设置系统为XP,添加riched20
,riched32
和msvcp60
函数库。
再安装即可。
(2) 使用官方的Wine,更换桌面为KDE
毕竟官方最新版Wine还是可以运行更多的东西,如果想用官方的Wine,建议深度用户换一个桌面环境,我建议换KDE,经测试KDE上面不会出现上述bug。安装KDE教程可以看我Linux专栏里面安装KDE的教程。
① QQ和微信
安装QQ,微信时和上面deepin-Wine的操作基本类似,只是命令变成了wine
。
新建容器并执行配置:
wine winecfg
如果需要自定义Wine容器位置执行:
WINEPREFIX=自定义Wine容器的绝对路径 wine winecfg
然后修改容器系统为XP(新版本这个不改也可以)。
然后函数库加入msvcp60
,riched20
和riched32
这三个库,安装微信的话必须先下载riched20.dll
和riched32.dll
并替换,这里操作和上面deepin-wine的操作一样。
然后再在函数库加入txplatform.exe
和ntoskrnl.exe
,并在下面已有的函数库顶替列表中,分别选中这两者-编辑-停用-确定:
配置的函数库最终如下图:
这样就可以正常使用QQ,微信了!
② TIM
安装TIM之前的配置和上述也一样,和微信一样,TIM安装之前也需要下载原生的dll文件(riched20.dll
和riched32.dll
)并替换,但是TIM启动一次后,很容易出现第二次无法启动的情况,这通常是进程残留导致,可以先杀掉TIM的残留进程,执行命令:
kill -9 $(pidof TIM.exe)
再启动就好了!
7,Wine编译完成后无法运行的问题
一般来说,前面安装了那些依赖库之后,可以完美运行Wine了。但是当你把编译好的Wine拷贝到别的机器运行时可能会出现Wine因为依赖问题不能运行的情况。
在64位的Linux下,使用下列几个命令添加i386
架构并安装依赖库即可。
必须安装的:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install lib32z1 libc6 libc6:i386 libasound2 libasound2:i386 libpulse0 libpulse0:i386 libdbus-1-3 libdbus-1-3:i386 libfontconfig1 libfontconfig1:i386 libfreetype6 libfreetype6:i386 libgnutls30 libgnutls30:i386 libgl1 libgl1:i386 libunwind8 libunwind8:i386 libx11-6 libx11-6:i386 libxcomposite1 libxcomposite1:i386 libxcursor1 libxcursor1:i386 libxfixes3 libxfixes3:i386 libxi6 libxi6:i386 libxrandr2 libxrandr2:i386 libxrender1 libxrender1:i386 libxext6 libxext6:i386 libgstreamer1.0-0 libgstreamer1.0-0:i386 libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-0:i386 libosmesa6 libosmesa6:i386 libsdl2-2.0-0 libsdl2-2.0-0:i386 libudev1 libudev1:i386 libvulkan1 libvulkan1:i386 libcapi20-3 libcapi20-3:i386 libcups2 libcups2:i386 libgphoto2-6 libgphoto2-6:i386 libsane1 libsane1:i386 libkrb5-3 libkrb5-3:i386 samba-libs ocl-icd-libopencl1 ocl-icd-libopencl1:i386 libpcap0.8 libpcap0.8:i386 libusb-1.0-0 libusb-1.0-0:i386 libv4l-0 libv4l-0:i386
推荐安装的:
sudo apt install samba-libs:i386
推荐安装的几个软件包若在某些系统上无法安装,就可以不用安装。
这样就可以正常地使用Wine了!
8,Wine命令的常见变量参数
刚刚安装完Wine后在终端输入:
winecfg
即可初始化一个Wine容器,Wine容器可以理解为一个极小的Windows系统环境。默认容器被创建于用户文件夹的.wine
文件夹下。
后续使用winecfg
可以打开默认位置容器的设置面板。
Wine的所有命令前面都可以加上变量,例如我们想指定Wine容器的位置,使用WINEPREFIX
变量即可:
WINEPREFIX=/home/swsk33/wineapp winecfg
注意WINEPREFIX
变量必须是绝对路径。前面指定这个变量,执行wine
,winecfg
等等命令时都会以你指定的文件夹为容器,Windows应用也会被安装进去,容器文件夹不存在会自动创建,因此我们常常通过上述命令指定一个位置初始化一个Wine容器并设定。
容器也分为32位和64位的,wine 6.10及其以上版本默认会创建64位容器,而低版本默认创建32位容器。如果你的应用是32位的那么还是建议创建32位容器。使用WINEARCH
变量指定容器的架构:
# 创建32位容器
WINEARCH=win32 winecfg
# 创建64位容器
WINEARCH=win64 winecfg
如果说容器已经存在且你指定的WINEARCH
和它本身架构不匹配,那么就会出错,所以建议仅仅是第一次创建初始化容器时使用WINEARCH
变量指定架构。
与此同时,我们在终端使用Wine运行程序时会发现它在不停输出调试信息,但是平时我们并不需要,为了减少资源浪费我们可以使用WINEDEBUG
变量设定其调试级别为最低:
WINEDEBUG=-all wine app.exe
可见指定其为-all
即可。
这是几个常见的变量,他们其实可以组合同时使用,例如:
# 指定容器路径为/home/swsk33/wineapp文件夹,指定其架构为32位,并设定为最小调试信息
WINEPREFIX=/home/swsk33/wineapp WINEARCH=win32 WINEDEBUG=-all winecfg
9,官方文档
其实我觉得Wine的官方文档真的写的非常好,很详细易懂。这里给出我参考的所有官方文档列表,大家也可以作为参考: