当前位置: 首页 > 工具软件 > Wine-Doors > 使用案例 >

wine移植研究文档

武元白
2023-12-01

1. wine 介绍

1.1. 历史背景

Wine 项目起始于 1993年,由Bob AmstadtEric Youngdale 发起的,它的根源可以追溯到 90 年代早期出现的用于 UNIX的DOS和Windows 模拟器。最开始是MIT的一个实验室项目,后来改为GPL授权。

Wine 项目最初是将 16位的应用程序移植到 Linux,而几年之后,已可以在 Linux上运行 Microsoft Word 和 Excel。现在它有一百多万行代码。

人们一直认为,在桌面上采用 Linux 的主要障碍是应用程序不足。商用桌面应用程序供应商还不能确定他们是否应该投入时间和精力将他们的 Windows 应用程序移植到 Linux,他们基本上是在等待 Linux 大规模应用于桌面。另一方面,Linux 需要应用程序才能大规模应用于桌面。这是一个经典的先有鸡还是先有蛋的问题,而 Wine 通过在 Linux 上运行现有的 Windows 应用程序而解决了这一问题。

1.2. wine 是什么

Wine 项目实际是一个二合一的项目。它们提供了一个名字叫做 Winelib的开发工具包,用于将应用程序从 Windows 移植到 Linux(和 Unix);它们还提供了一个程序加载器,让 Windows 二进制文件可以在 Unix 和类 Unix 系统中运行。本文讨论的主要是后者。

Wine 程序加载器让运行于 x86 上的 Linux 和其他类 Unix 操作系统可以加载并运行 Windows x86 可执行文件,不过那只是它要解决的问题的一部分。因为 Windows 可执行文件总是会链接到其他的库,而这些库是 Windows 操作系统的一部分,Wine 还最大可能限度地实现了那些 Windows 内部构件,即 Linux 上通常所指的 Win32 API。

虽然 Windows 和 Linux 有很大的不同,但是就基本的层次而言,与任何现代操作系统一样,还是有很多类似之处的 -- 比较明显的包括,对文件和目录的支持,对同时运行多个程序的支持,类似的用户界面以及对多媒体的支持。

1.3. 支持的功能

Windows 可执行文件:

Wine 完全支持 Windows 可执行文件( .exe 和 DLL)的二进制加载。

DLL

Wine 有几百个 Windows DLL 的内部实现 -- 不过,其中没有多少是完全的实现。例如,包含有用户界面相关函数的 userd32.dll 在开放源代码的 Wine 中实现了 92%。

COM

这是一种几乎被所有的大型 Windows 应用程序所使用的 Windows 技术,它支持诸如将一个 Excel 电子数据表嵌入到 Word 文档中等功能。这一技术得到了 Wine 的很好的支持。

注册表:

这是另一个几乎任何一个 Windows 应用程序都会使用的关键技术,Wine 实现了大约 90% 的 Windows 注册表管理 API。

核心功能:

核心系统功能也得到了特别好的支持。如前面提到的,尽管 Linux 和 Windows 之间存在区别,但是基本的层次上还有很多类似之处,因此与进程、线程、文件和消息队列相关的核心系统 API 得到了近乎完美的支持。

音频和视频:

Wine 支持 Windows 音频和视频文件的运行(还可以使用 Windows 媒体播放器)。

打印:

也得到了支持,可以从一个在 Wine 中运行的 Windows 应用程序进行打印。

ODBC

Wine 支持那些需要通过 ODBC 访问数据库的 Windows 应用程序。

调试:

Wine 有一个非常健壮和强大的内置调试器,除了支持标准的调试功能外,它还为调试运行于 Linux 上的 Windows 二进制程序进行了定制。

它是 Wine 为其开发者提供的最重要工具之一。

Wine 还有一个设计完备的追踪和记录日志的模块,可以帮助调试。

我们之所以强调这一点,原因在于,尽管框架是健壮的,但是,当在 Wine 中安装和运行 Windows 应用程序时有很多不确定因素,在使用开放源代码的 Wine 时迟早会停下来进行调试。

2. wine 安装

2.1. 版本选择

目前wine的稳定版是1.0.1,最新开发版为1.1.22。

个人建议使用最新开发版的前2两个版本,理由是功能比较多,而且比最新开发版相对稳定。

当然如果比较关心稳定性,而且稳定版也能够满足要求,则建议使用稳定版。

2.2. 安装方法

wine支持rpm、二进制和源码安装。

个人建议采用源码安装,虽然安装速度慢点,但是后期比较稳定。

要想正常运行wine,需要安装linux桌面,因为win32应用程序都是带窗口的。

源码安装步骤:

1、 到wine网站下载源码。

地址:http://sourceforge.net/project/showfiles.php?group_id=6241&package_id=77449

2、解压源码。

3、编译源码:./ configure、make depend、make、make install。

还有一个简单的方法,cd到源码目录,执行:./tools/wineinstall。

4、如果以前安装过的wine,可以通过执行make uninstall来实现。

3. wine 配置

可以通过winecfg来实现wine的大部分配置。

配置分为缺省配置和应用程序配置,这点至关重要

如果你要全局生效,则只要更改缺省配置即可。

如果你要独立配置某个应用程序,则需要先把应用程序添加到winecfg,然后选中该应用程序再进行配置。

3.1. 虚拟桌面

使用这个选项可以使软件的安装更加流畅。我发现在不使用这个选项的时候,使用某些程序会导致已经激活的对话框、CDKEY输入窗口或更换光盘的确认窗口不能出现在前端。让我以为程序卡死了,就kill掉了进程。选择这个选项还能够避免程序锁死你的桌面或者把你的屏幕分辨率改成难看的模式。

使用这个选项时,wine会在Linux当前桌面上再启动一个虚拟桌面。

如果不启动虚拟桌面也能够正常运行的话,建议不要启动,这样可以使linux桌面更加简洁。

3.2. 使用 Application Settings

你可以在winecfg的Application标签里的Application Settings对话框对个别的程序进行自定义设置。那里只允许你进行windows兼容运行模式设置、某些显示设置和DLL的设置。

当你只需要设置某个程序使用某些特定的windows自带的DLL,不希望其它程序(包括wine)使用这些native的DLL的时候(而其它程序使用这些DLL会导致问题)。wine自带的DLL叫做builtin,windows下原生的DLL叫做native,这个选项就会变得十分有用。在进行DLL设置时我都用这个方法,就是为了防止某些对wine的运行存在潜在威胁的nativeDLL被wine调用(在一般情况下, wine只调用自带的builtinDLL,而不会使用native的DLL,版权问题,除非经过设置,如上所述)。这样我就只是修改了那些可执行的配置文件,当我不需要时,可以改回来而不会损坏整个Wine。

3.3. Windows 版本

对不同的程序尝试不同的Windows版本。这就是说一个为了XP而设计的游戏可能会在wine的98模式的支持下能更好地运行。在做这个之前确认你已经把程序添加到Application的白框中,并且选中,反色显示。

3.4. 声卡驱动

有些游戏是需要OSS才能运行,但是OSS已经不会再继续开发了。

个人推荐只是独立声卡使用ALSA,集成的还是使用OSS最好。

3.5. 谨慎对待 DLL

winecfg可以让你用native的DLL替换builtin的DLL。下面的这些DLL是绝对不能被替换的。kernel32.dll, gdi32.dll,user32.dll,和ntdll.dll。有些nativeDLL也可能使一些程序不能运行。记得永远不要覆盖wine自带的 dll,如果native的用不了就用builtin的换回来。有些MS的DLL要得到许可才能用,如果你没有许可,就不要用。

3.6. 注册表键值

有些设置是不能通过winecfg来进行设置的,但是可以在注册表中进行设置。在wine的wiki中有一篇保持更新的文章:http://wiki.winehq.org/UsefulRegistryKeys

有两个键值是非常有用的,一个是Alsa Driver的UseDirectHW,可以解决一些声音跳顿的问题;还有Direct3D的VideoMemorySize,你应该设置成你的显卡的准确显存,默认wine会设置成64MB。

3.7. 安装 Wine Gecko IE engine

有些程序的运行依赖于IE,但是,安装IE会严重地破环Wine。所以可以安装Wine Gecko IE engine作为替代品。

a、在终端下运行下面的命令:

wine iexplore http://www.winehq.org

b、当出现安装提示时回答yes

c、打开http://wiki.winehq.org/UsefulRegistryKeys,找到HKEY_LOCAL_MACHINE板块

d、把所有有关Internet Explorer的键值加到注册表中

安装完成后,运行:wine iexplore http://www.winehq.org

成功的话就会出现winehq的主页。

3.8. 支持中文

1、 从windows目录下的Fonts里的simsun.ttc复制到/home/user/.wine/drive_c/windows/fonts里面。

2、 创建符号连接。

cd /home/user/.wine/drive_c/windows/fonts

ln -s simsun.ttc simfang.ttc

创建一个simfang.ttc 是许多 Windows 应用默认使用 simfang.ttc 字体。

3、 linux上要按照中文语言包,否则不支持gbk等中文字符编码。

4、 当前用户的终端字符集设置为LANG=zh_CN.gbk即可。

3.9. 安装软件

1、不要在CD的目录下安装程序,就是不要cd到CD的挂载目录运行安装程序。

如果这样做的话,就会在换CD时出现CD不能推出的问题,用下面的命令来安装CD:

wine /media/cdrom0/setup.exe

2、需要用到“wine eject”

如果安装程序需要你换CD,而系统却说不能推出CD,那就打开一个新终端,输入:

wine eject d:

3、安装.msi文件。

有些windows的安装程序是使用msi来安装的,那就用下面的命令来安装:

wine msiexec /i install.msi

或者

wine start install.msi

4、不要安装DirectX。

wine有它自己的DirectX库,安装微软的DirectX会破坏wine的DirectX库和Wine。

但是,d3dx9_##.dll和d3dx10_33.dll可以从Windows复制过来使用,可能会在启动某些游戏时有所帮助。使用这些dll你需要微软的授权证书。

4. 使用wine

4.1. 运行win32 程序

1、 使用wine application.exe或者wine application,不过要求可执行程序必须是.exe结尾的。

2、 对于控制台程序则必须wine console application.exe或者wine console application。

3、 如果不知道是窗口程序还是控制台程序,则可以试试:wine start application.exe。

4、 运行wine32程序前必须cd到程序目录,这个务必记得哦。

4.2. 其他wine 命令

wineboot 模拟windows的重新启动

wine control 运行控制面板

wineserver wineserver会随着wine的命令自动启动,但也能通过终端启动来达到不同的目的。

wineserver的一些参数

a、-d# 设置终端中debug的显示级别。

b、-h 显示wineserver帮助文件

c、-k kill掉当前的wineserver,当程序失去响应而你要结束它时使用。

d、-p 让wineserver一直运行,也就是说即使程序退出了,wineserver还继续运行。当你需要运行连续的程序时可以使用,这样可以缩短程序的启动时间。

e、-w 让wineserver一直运行直到当前已激活的wineserver退出。

4.3. 让wine 运行得更流畅

当出现程序运行缓慢或性能起伏不定的问题时,可以通过提高进程的优先级来解决。启动游戏后,可以使用“renice”命令来改变进程的优先级。 “renice”命令可以改变当前进程的优先级,“nice”的值是优先级级别的标志,(高优先级=低nice值,低优先级=高nice值)。这个命令把程序优先级的值设置为从-20(最高优先级)到19(最低优先级)之间的任何一个整数值,而默认的值是0。在启动游戏以后,你需要打开另外一个终端输入下面的命令来改变程序的优先级:

sudo renice -10 -n game.exe

在用Wine运行游戏时,我不推荐直接把程序的优先级设置到-20,最好是从-10开始,如果效果提升不明显,可以一步步尝试小幅度的提高(- 11,-12,……)。你会发现绝大多数的游戏不需要比-10更高的优先级就已经可以达到最好的性能了。不用多说(我认为),在游戏中你可以用ALT- TAB组合键回到桌面使用“renice”命令。

5. 第三方资料

5.1. WineTools

WineTools是一个菜单式的可以安装90多个常见Windows程序的软件。它也可以帮助你设置Wine的基本目录。已经不再有人维护 WineTools,它已经两年没有升级了,但很多用户都发现它依然有用。而WineTools所作的一切事情都可以自己通过winecfg或终端完成。

5.2. Wine-Doors

Wine-Doors是一个帮助你安装很多的Windows程序,包括游戏的一个图形界面的软件。它现在还处在开发阶段,但已经发布了一个可以下载的最初版本。就这个软件看来,是非常有前途的。

5.3. Cedega

Cedega就技术上来说是Wine的一个分支,它明确地针对于游戏。cedega包含了一个安装和运行游戏的图形界面,还加上了对受防拷贝保护的软件的支持(不需要使用破解来免CD)

wine的对防拷贝的支持不是很好。

cedega不适免费的,最低消费是购买3个月,每月3美元,如果预付一年的费用的话,可以享受一点折扣。

cedega从前叫做WineX,在Wine还是MIT软件,而不是现在的GPL的时候,WineX就从wine的一个分支分离出来,就因为cedega不属于GPL,cedega不再对wine的代码发展作贡献了。

再加上cedega缺少支持,很多人便不再用cedega 在linux下玩游戏。

5.4. CrossOver

CrossOver从技术上来说,CrossOver不是wine的一个第三方产品,而是wine的主要财力支持者。

CrossOver一开始是以在linux下运行Microsoft Office软件为目标的,但最近它开始添加对游戏的支持。

CrossOver基于一个更老,更稳定的Wine版本(译者:好像是0.9.17),但 CrossOver也随着Wine一起升级。CrossOver标准版的售价是39.95美元。

ReactOS

正如CrossOver一样,ReactOS也是Wine的一个支持者,基于许多Wine已经完成的成果,它致力于建立一个能与Windows完全兼容的操作系统。

完成后,ReactOS能够使用Windows的驱动程序和软件,完全兼容。这项计划还处于开发阶段,但已经可以提供安装CD、 LiveCD、QEMU和VMware镜像的下载。

6. 常见问题总结

1、如果出现wine configure: error: X development files not found.

解决:---安装相关的devel支持,如用gnome桌面的,得安装上gnome-devel,最好在开始安装时选择。

2、要wine支持中文,要安装linux时安装中文语言包,然后把当前用户的终端字符集设置为LANG=zh_CN.gbk即可。

同时,从windows目录下的Fonts里的simsun.ttc复制到/home/user/.wine/drive_c/windows/Fonts里面。

启动中文桌面。

3、wine支持unicode。

4、1.1.15版本之前不支持mfc,需要手工拷贝mfc42d.dll和mfc042d.dll等mfc相关dll到/home/你的用户名/.wine/drive_c/windows/system32,并且在winecfg的应用程序中添加要运行的程序,选中该应用程序,然后在函数库的输入框中输入添加的dll名称并且编辑为原装或原装优先。

使用wineserver -p可以让wineserver一直运行,这样可以缩短wine命令的响应时间。

5、winecfg可以针对不同的应用程序设置不同的windows版本和桌面、dll设置等。

6、当缺少DLL时,警告信息会提示缺少的DLL名称,然后把缺少的DLL从windows系统中拷贝过来并配置一下即可。

7、win32 api的dll建议尽量使用wine的,这样相对比较稳定,而且没有版权问题。

8、如果程序中不可避免的要使用非文档化的win32 api,则只能把该api所在的dll替换成原始的windows dll。

9、可执行程序的扩展名必须为.exe,否则无法在wine中运行。

10、在wine中尽量少运行安装程序,因为安装程序做的部分工作在wine可能不支持。

11、可以把要替换的DLL放到程序的当前目录,然后配置原生DLL优先。

12、控制台写入中文的话乱码无法解决。

13、如果控制台程序无法启动,可以考虑使用export LANG=en_US.utf8改变语言字符集。

14、wine中打开控制面板:wine control。

 类似资料: