(七):处理MFC-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

(七):处理MFC

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50703886 (一):简介 为了能够在一个Winelib应用中使用MFC,你需要首先使用Winelib重新编译MFC。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50703886

(一):简介


为了能够在一个Winelib应用中使用MFC,你需要首先使用Winelib重新编译MFC。在理论上,你应该为Windows的MFC编写一个封装(如何编写在后面介绍)。但是,在实践中,对MFC来说,可能不是一个真正的解决方式:

  • 数量巨大的API使得编写封装的工作量很大

  • 进一步说,MFC包含大量的API,这些API在制作封装的时候处理起来是非常复杂的。

  • 即使你编写了封装,你也需要去修改MFC的头文件以使编译器不会阻塞他们。

  • 在你应用中的很大一部分MFC代码是以宏的形式展现的。这就意味着为了能够编译基于你的应用的MFC程序,需要有更多的头文件需要去处理。
    这就是为什么这里需要专门帮助你来使用Winelib编译MFC程序。

(二):法律问题


这一小节的目的就是讲述一下潜在的法律问题。这个是一定要注意的。

在编译你的程序期间,你会从若干个源码链接你的代码:你的代码,Winelib代码,微软的MFC代码和可能引入的其他代码。所以,你一定要确定遵守所有源码的协议。你被允许的和不被允许的都会影响你如何编译并且发行你的程序。举个例子,如果你在GPL或者LGPL协议下发行你的代码,你不能使用MFC,因为这些代码不允许你做开放。有一个解决办法-在你的代码的协议中,你可以为MFC库做一个除外说明。

Wine/Winelib发行是按照GNU的LGPL协议发行的。查看协议来获取一些在源码修改和发行方面的限制。大体上,他可能会满座任何类型程序的限制。另一方面,MFC是以一个非常严格的协议发行的。当使用MFC的时候,有三个方面你需要知道。

首先,在你的计算机上你必须依法获取MFC源码。MFC源码是作为Visual Studio的一部分发行的。Visual Studio的许可证书表明他是一个单一的项目,不能被分解成一个个的组件。所以最干净的办法就是购买Visual studio,然后通过Wine或者是在一个双启动Linux中安装他。

然后,你需要检查你是否被允许在一个非微软的操作系统上重新编译!这也是随着MFC的版本而变化的。下面是在VS6.0中的MFC的部分许可证:

1.1 通用许可证。微软授予你作为个人,非排他性许可证来编译和复制软件产品用于设计,开发和测试你的与微软操作系统产品结合的软件产品的唯一目的。

所以这就意味着你不能使用这个许可证来为Winelib编译MFC。幸运的是,VS6.0服务包3许可证,下面所列部分:

1.1 通用许可证。微软授予你作为个人,非排他性许可证来编译和复制软件产品用于设计,开发和测试你的软件产品的唯一目的。

所以在这个许可证名下,看上去我们可以编译用于Winelib的MFC。

最后,你必须检查你是否拥有发布MFC库的权利。检查许可证的”发布和你的发布权限”部分。许可证指出,如果没有调试信息,并且如果你发布一个向MFC库中提供重要功能的应用的时候,你仅仅有权利发布MFC库的二进制版本。

(三):编译MFC


这里有一些MFC和Winelib编译的建议:

我们推荐在--interactive模式下运行winemaker来为MFC和ALT部分指定正确的选项(获取正确的包含路径,不要考虑以MFC为基础的MFC,将他编译成库而不是可执行文件)。

然后,当编译MFC的时候,你肯定需要一定数量的_AFX_NO_XXX宏。但是这些是不够的,还有一些其他的事情你需要去做,包括'#ifdef-out'。举个例子,

Wine的richedit库支持不是很好。下面是我使用的一下AFX选项:

#define _AFX_PORTABLE
#define _FORCENAMELESSUNION
#define _AFX_NO_DAO_SUPPORT
#define _AFX_NO_DHTML_SUPPORT
#define _AFX_NO_OLEDB_SUPPORT
#define _AFX_NO_RICHEDIT_SUPPORT

你也需要传统的CMonikerFile,OleDB,HtmlView等。

我们建议使用Wine的msvcrt头(-isystem $(WINE_INCLUDE_ROOT)/msvcrt),虽然这意味着你必须要暂时禁止winsock的支持(使用#ifdef,将他排出inwindows.h).

你应该使用版本不低于2.95的g++编译器.g++ 2.95不支持未命名的结构体,但是最新的版本是支持的,这有很大的帮助.下面是值得一下提的一下选项:

  • -fms-extensions(帮助获取更多代码来编译)
  • -fshort-wchar -DWINE_UNICODE_NATIVE(Unicode支持)
  • -DICOM_USE_COM_INTERFACE_ATTRIBUTE(使COM代码工作)

当你第一次编译到链接阶段的时候,你将会得到很多未定义的符号错误.为了纠正这些错误,你必须要返回源码,然后使用#ifdef来排除更多的代码直到你到达闭包状态 .有很多文件你不需要去编译.

也许有一天我们将会有一个现成的makefile文

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章