11

对于静态 Win32 库,如何检测是否设置了任何“使用 MFC”选项?

IE

#ifdef ---BuildingForMFC---
....
#else
...
#endif
4

3 回答 3

12

我一直检查正在定义的符号 _MFC_VER。

这是正在使用的 MFC 的版本号 0x0700 = 7.0

它位于 MSDN 的“预定义宏”中

于 2009-07-28T21:38:09.073 回答
4

我已经在仅针对 Win32 控制台的原始项目中检查了 Visual Studio 2013,因此我必须第二次添加 MFC 支持(不使用项目向导)。以下是我的发现:

  • 宏 _MFC_VER 在 afxver_.h 中定义,包含在 afx.h 中。因此,如果您没有在 .cpp 文件中直接/间接包含 afx.h,则您没有定义 _MFC_VER 宏。例如,在项目中包含一个不包含 afx.h 的源 .cpp,该文件将在没有 _MFC_VER 宏定义的情况下进行编译。因此,调整 c++ 代码(例如外部库)来检测 MFC 库的使用并可选地支持 MFC 库是没有用的。

  • 如果您手动打开使用 MFC(在解决方案资源管理器中选择项目,而不是右键单击,配置属性 -> 常规 -> 使用 MFC)您有两种可能性:

    • A) 选择“在共享 DLL 中使用 MFC”选项。这实际上更新了将 _AFXDLL 的定义添加到预处理器宏列表的命令行参数。
    • B) 选择“在静态库中使用 MFC”选项。这实际上删除了定义的 _AFXDLL 宏,但没有添加宏定义,因此无法告诉您是否实际使用了 MFC。

因此,在我的测试活动中,只有模式 A 可以有效地用于了解 MFC 库是否包含在正在构建的项目中。

我维护了一个支持许多平台(Mac OSx、WinX 控制台、WinX MFC、iOS、Unix、Android)的 C++ 跨平台库,并且使用动态 DLL 启用 MFC 是透明检测 MFC 存在的唯一方法。例如:

#if defined(_AFXDLL)
#    include <afx.h>
#endif

显然,您可以在项目预处理器列表中手动添加宏定义 (_AFX)。

于 2015-04-27T18:44:43.067 回答
2

该符号_AFX通常是为 MFC 项目定义的。

于 2009-07-28T21:30:09.557 回答