zoukankan      html  css  js  c++  java
  • (七):处理MFC

    (一):简单介绍


    为了可以在一个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文

  • 相关阅读:
    [堆栈]Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈
    [TI-DSP]sysbios的swi
    [库函数]动态库和静态库优缺点比较
    [S32K]GPIO使用
    [S32K]FreeRTOS使用
    [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
    [S32K144]多通道ADC使用
    三天搭建博客,包括文章迁移
    网站优化的艺术与科学之实战
    网站优化的艺术与科学之工具和基础知识
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7401556.html
Copyright © 2011-2022 走看看