(一):Winelib介绍
1:什么是winelib
Winelib是一个开发工具套件,他允许你能够在Unix中编译你的Windows应用程序。
大多数Winelib代码是由一些win32 API实现组成的。幸运的是,这一部分是在Wine中百分百分享的。其他的包括窗口兼容头文件和一些工具,如资源编译器(甚至这些是在wine编译的时候使用)。
幸亏有上面介绍的这些库和工具,Winelib才能够支持大多数的C和C++源码,资源和信息文件,并且你可以生成一些图形或者是终端应用,还有动态链接库。
但是它并不支持16位的源码,因为他依赖的类型(特别是分段指针)是不被Unix编译器所支持的。当前,对于对于微软编译器的一些特征例如本地COM支持和结构化的异常处理等都是不支持的。所以,当你使用Winelib去编译你的应用程序的时候,你可能需要去做一些修改。下面我将要介绍如何去做这个工作。
当你使用Winelib重新编译你的应用程序的时候,你获得的是对Unix API的调用,也就是说直接从你的Windows源码中调用Unix的API。相对在wine中运行一个未被修改的Windows应用程序来说,这需要一个很好的整合。另一个非常好的地方就是Winelib应用程序可以非常简单的在非intel架构的处理器上重新编译,并且不需要慢速的这个处理器的模拟器就能运行。
2:系统需求
Winelib的系统需求和Wine的系统需求是相似的。
基本上就是如果你能在你的计算机上运行Wine,那么你就能在你的计算机里面运行Winelib。但是反过来可就不一定了。你也可以在不被Wine支持的平台上编译Winelib和Winelib应用程序,一个典型的平台就是非386处理器。但这依然是未知的领域。不过目标是一个386平台也是非常合理的。
主要的不同就是编译器变得更加重要了。极力推荐您使用gcc,g++和GNU的二进制工具。越早使用gcc编译器越好。对于任何数量的代码,你不能考虑比gcc 2.95.2编译器更早的编译器了。最新的gcc编译器包含了一些有用的bug修复和对匿名结构体和共用体有更好的支持。这能够宝珠你减少对你代码的修改。但是对于一些编译器的不稳定的发行版,在你得产品中不要使用他们。
3: 开始
3.1 Winemaker介绍
那么当我们使用Winelib去编译一个Windows应用程序的时候需要什么呢?当然,这依赖于你的程序的复杂程度,但是也是有一些所有应用程序共享的点:
- 你的文件可能是有问题的。例如他们可能都是大写:HELLO.CPP。那样工作起来可能不是很好。
- 你的include语句中的文件名称可能是错误的:他们可能包含Windows.h而不是windows.h
- 你的include语句可能使用’\’而不是’/’。’\’是不被Unix编译器识别的,但是’/’是被这两个环境都识别的
- 你可能需要运行一个DOS来进行一个Unix文件转换,否则,当编译器认为你的’\’不是在一行的末尾的时候,你将会遇到麻烦。
- 你需要编写一个新的makefile文件
要注意这些所有的问题就是使用Winemaker。
Winemaker是一个Perl脚本,他被设计来帮助你启动你的Windows项目到Winelib的转换。为了这样做,他会分析你的代码,解决上面遇到的问题并且直接生成一个Makefile文件。
我们假设你已经在Wine源码的根目录下面。把你的项目转换到Winelib是非常简单的,只需要下面两行命令(注意第一个命令最后面的点)
winemaker --lower-uppercase .
make
但是事情别没有那么简单。
3.2 实例测试
在开始一个大项目之前,我们可能想要使用一个小项目来尝试一下。notepad应用是非常合适的。他能够在programs子目录中找到。
notepad是一个非常简单的应用,但是也有一些C,头文件和资源文件。
如果在notepad目录中包含一些之前构建的文件,首先执行make clean清空一下。创建一个单独的文件夹命名为notepad2,他不能和应用的Wine复制版本冲突。将notepad中的源码(.c,.h,*.rc文件,还有就是图标文件)复制到notepad2目录中。
下面执行上面刚刚说的那两个命令:
winemaker --lower-uppercase .
make
注意,在链接的时候因为没有定义到wnsprintfW的引用就会失败。
这是因为我们没有指定需要链接的库。通常情况下你是知道你需要什么样的库或者是在你之前的Makefile文件或者是项目文件中能够找到这些需要的库。
为了解决这个问题,打开notepad/Maekfile.in文件,寻找变量IMPORTS.就会出现一个导入的库列表。然后重新运行winemaker,但是这些库前面需要加上前缀-i。
winemaker --lower-uppercase -icomdlg32 -ishell32 -ishlwapi -iuser32 -igdi32 -iadvapi32 .
make
这样就能够编译成功了,编译完成之后,我们就是可以运行notepad2.exe.so或者是./notepad2.exe来运行了。
是不是很激动呢?
好了,这篇文章就先到这里,后面,我们还需要对Winelib进行更深一步的了解。