[技术学习]使用 wine 在Unix平台进行 WIN32/MFC 开发

插叙:
@@ 大项目一定得用 MFC 吗?
## 不用 MFC,那你用什么?
@@ 我想用 wxWidgets。
## 。。。
@@ 我看 wxWidgets 和 MFC 的构架很相近,相互移植起来也容易。
## 但是你为何不要用 MFC 呢?我们学的就是 MFC 呀。
@@ 但是 MFC 在别的平台上没办法部署。
## 那你就用虚拟机装个 Windows,再在里面装个 Visual Studio 啊。
@@ 。。。


1) 使用 WIN32 api 开发

winelib
C 源代码文件 -> 目标文件
winegcc -mno-cygwin -I. -c winmain.c -o winmain.o
资源文件 -> 目标文件
wrc resource.rc -foresource.res
链接
winegcc winmain.o resource.res -mwindows -mno-cygwin -m32 -o winmain.exe.so
执行
wine winmain.exe.so

生成原生的 wine 二进制文件
优点:由于是直接用 wine 编译的,通过 wine 加载和执行效率都比原生的 WIN32 exe 好。而且自带 winemaker 工具,可以很方便地生成 makefile 文件或者从 Visual Studio 的工程项目/解决方案文件转换成 makefile,自动处理 DOS 不区分大小写引起的问题。
缺点:二进制文件无法直接在 Windows 上执行。

mingw32
C 源代码文件 -> 目标文件
i686-pc-mingw32-gcc -mno-cygwin -I. -c winmain.c -o winmain.o
资源文件 -> 目标文件
i686-pc-mingw32-windres resource.rc -o resource.o
链接
i686-pc-mingw32-gcc winmain.o resource.o -mwindows -mno-cygwin -m32 -o winmain.exe
执行
wine winmain.exe

生成原生的 WIN32 二进制文件
优点:二进制文件能够直接在 Windows 上执行。Windows 上也有 mingw32,一致性可以保持。
缺点:需要自己弄 makefile,而且由于 mingw32 的 windres 资源编译器不支持 utf-8 字符,如果在资源文件中硬编码中文汉字,结果编译出来会显示为乱码(utf-8 强行识别为 iso-8859-1)。快捷键资源失效。


2) 使用 MFC 开发

VC6 编译器 + MFC 库
下载 winetricks:wget -c http://kegel.com/wine/winetricks。
安装运行时文件:sh winetricks -q vcrun6 mfc40 dcom98。
将 VC98/Bin/ 目录下的 C1XX.DLL,C2.DLL,CL.EXE,CVTRES.EXE,LINK.EXE 软链接到 ~/bin 里面。
将 VC6/Common/MSDev98/Bin/ 目录下的 RCDLL.DLL,RC.EXE 软链接到 ~/bin 里面。
执行 CL.EXE 会报缺少 mspdb60.dll,直接从网上下载这个 mspdb60.dll 文件放在 ~/bin 里面。

C++ 源代码文件 -> 目标文件(路径自己换一下吧)
CL.EXE /c /nologo /GX /MD /D "_AFXDLL" /I. /I/home/nihui/vc6/VC6/VC98/Include /I/home/nihui/vc6/VC6/VC98/MFC/Include mfcmain.c /Fomfcmain.obj
资源文件 -> 目标文件
RC.EXE resource.rc /foresource.res
链接
LINK.EXE /nologo /subsystem:windows /LIBPATH:/home/nihui/vc6/VC6/VC98/Lib /LIBPATH:/home/nihui/vc6/VC6/VC98/MFC/Lib mfcmain.obj resource.res /OUT:mfcmain.exe
执行
wine mfcmain.exe

生成原生的 WIN32 二进制文件
优点:二进制文件能够直接在 Windows 上执行。也可以直接链接 Windows 的库(如 MFC)。编译器选项和 Windows 版的一致。
缺点:具体开发时需要自己弄 makefile。VC6 编译器对 C++ 语言支持不佳。非自由软件,需购买许可。


3) 一些 FAQ

为什么 winelib 编译出来的 exe.so 文件无法直接放在 Windows 上执行?
虽然从表面上看,也是用 wine xxx 的方式执行,但文件本身已不是 WIN32 程序,而是 wine 库,就好比 Unix 的可执行文件也不能在 DOS 下执行一样。

VC6 的 IDE 呢?
VC6 的 IDE 可以运行,但是调试功能坏了,编译功能也需要花功夫才能搞定,何况编辑功能也不强,中文版界面甚至会显示不出中文字符。所以还不如直接用 make 管理编译,自己选一个编辑器编辑。

为什么使用 VC6,而不是 VS2008 或者更新版本?
因为新版的 Visual Studio 带有 .net 框架支持,在 wine 上部署 .net 框架十分困难。而 vc6 则没有这部分。

win32 api 开发可以使用 VC6 编译器吗?
可以,但已经有支持 C++ 标准更好的自由软件替代方案,何必要用 vc6 呢?

MFC 开发可以使用 winelib 或者 mingw32 吗?
理论上和技术上可以,但这种做法可能不被允许。把 MFC 的源代码使用 winelib 或者 mingw32 编译,然后再用。所以,必须先得到 mfc 的合法拷贝。

如果我无视 MFC 库的授权许可问题,具体该怎么做呢?
使用 winelib 编译得自己弄好 mfc.dll.spec 文件,基本上就是函数库的外链符号表,很困难,如果真有意尝试请参阅以下文档。
http://www.winehq.org/docs/winelib-guide/mfc
http://www.cs.colorado.edu/~main/cs1300/doc/mingwfaq.html#guisapplicationframeworksuserinterfaces

使用 wine 进行 WIN32/MFC 开发 - nihui - Nihuis Blog
--------------------------------------------------------
本文转自:  http://shuizhuyuanluo.blog.163.com/blog/static/77818120091030113223845/

你可能感兴趣的:([技术学习]使用 wine 在Unix平台进行 WIN32/MFC 开发)