MFC 库可用于支持 ANSI 单字节和多字节字符集(MBCS)代码的版本,以及支持 Unicode 的版本(编码为 UTF-16LE、Windows 本机字符集)。 每个 MFC 版本都可用作静态库或共享 DLL。 此外,还有一个较小的 MFC 静态库版本,用于为对话排除 MFC 控件,对于大小非常敏感且不需要这些控件的应用程序。 MFC 库可用于调试和发布版本,这些体系结构包括 x86、x64 和 ARM 处理器。 可以使用任何版本的 MFC 库创建应用程序(.exe 文件)和 DLL。 还有一组 MFC 库编译,用于与托管代码进行交互。 MFC 共享 DLL 包含用于指示库二进制兼容性的版本号。
MFC 库版本的自动链接
MFC 头文件根据生成环境中定义的值自动确定要链接的正确 MFC 库版本。 MFC 头文件添加编译器指令,指示链接器在 MFC 库的特定版本中链接。
例如,AFX。H 头文件指示链接器链接 MFC 的完整静态、有限静态或共享 DLL 版本;ANSI/MBCS 或 Unicode 版本;并根据生成配置调试或零售版本:
#ifndef _AFXDLL
#ifdef _AFX_NO_MFC_CONTROLS_IN_DIALOGS
#ifdef _DEBUG
#pragma comment(lib, "afxnmcdd.lib")
#else
#pragma comment(lib, "afxnmcd.lib")
#endif
#pragma comment(linker, "/include:__afxNoMFCControlSupportInDialogs")
#pragma comment(linker, "/include:__afxNoMFCControlContainerInDialogs")
#endif
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "nafxcwd.lib")
#else
#pragma comment(lib, "nafxcw.lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "uafxcwd.lib")
#else
#pragma comment(lib, "uafxcw.lib")
#endif
#endif
#else
#ifndef _UNICODE
#ifdef _DEBUG
#pragma comment(lib, "mfc" _MFC_FILENAME_VER "d.lib")
#pragma comment(lib, "mfcs" _MFC_FILENAME_VER "d.lib")
#else
#pragma comment(lib, "mfc" _MFC_FILENAME_VER ".lib")
#pragma comment(lib, "mfcs" _MFC_FILENAME_VER ".lib")
#endif
#else
#ifdef _DEBUG
#pragma comment(lib, "mfc" _MFC_FILENAME_VER "ud.lib")
#pragma comment(lib, "mfcs" _MFC_FILENAME_VER "ud.lib")
#else
#pragma comment(lib, "mfc" _MFC_FILENAME_VER "u.lib")
#pragma comment(lib, "mfcs" _MFC_FILENAME_VER "u.lib")
#endif
#endif
#endif
MFC 头文件还包括用于链接所有必需库的指令,包括 MFC 库、Win32 库、OLE 库、OLE 库、从示例、ODBC 库等生成的 OLE 库。
ANSI、MBCS 和 Unicode
MFC ANSI/MBCS 库版本支持单字节字符集(如 ASCII)和多字节字符集(如 Shift-JIS)。 MFC Unicode 库版本在其 UTF-16LE 宽字符编码形式中支持 Unicode。 将 MFC 的 ANSI/MBCS 库版本用于 UTF-8 编码的 Unicode 支持。
若要将项目配置设置为在 IDE 中使用单字节、多字节或宽字符 Unicode 字符串和字符支持,请使用 “项目属性 ”对话框。 在 “配置属性>常规 ”页中,将 “字符集 ”属性设置为 “未设置 ”以使用单字节字符集。 将属性设置为 使用多字节字符集以使用 多字节字符集,或使用 Unicode 字符集将 Unicode 编码为 UTF-16。
MFC 项目使用预处理器符号_UNICODE来指示 UTF-16 宽字符 Unicode 支持,_MBCS指示 MBCS 支持。 这些选项在项目中互斥。
MFC 静态库命名约定
MFC 的静态库使用以下命名约定。 库名称具有窗体
uAFXcd。自由
其中,斜体小写中显示的字母是说明符的占位符,其含义显示在下表中:
规范 | 值和含义 |
---|---|
u | ANSI/MBCS (N) 或 Unicode (U):省略对话框中没有 MFC 控件的版本 |
c | 在对话(CW)或不使用 (NMCD) 中使用 MFC 控件的版本 |
d | 调试或发布:D=Debug;省略 Release 说明符 |
下表中列出的所有库都预生成在 \atlmfc\lib 目录中,用于支持生成体系结构。
图书馆 | DESCRIPTION |
---|---|
NAFXCW。自由 | MFC Static-Link 库,发布版本 |
NAFXCWD。自由 | MFC Static-Link 库,调试版本 |
UAFXCW。自由 | 具有 Unicode 支持的 MFC Static-Link 库版本 |
UAFXCWD。自由 | 具有 Unicode 支持的 MFC Static-Link 库,调试版本 |
AFXNMCD。自由 | 没有 MFC 对话框控件的 MFC Static-Link 库,发布版本 |
AFXNMCDD。自由 | 没有 MFC 对话框控件的 MFC Static-Link 库,调试版本 |
具有相同基名称和 .pdb 扩展名的调试器文件也可用于每个静态库。
MFC 共享 DLL 命名约定
MFC 共享 DLL 也遵循结构化命名约定。 这样,可以更轻松地了解应用于哪种用途的 DLL 或库。
MFC DLL 具有指示 二进制兼容性的版本号。 使用与其他库和编译器工具集具有相同版本的 MFC DLL 来保证项目中的兼容性。
DLL | DESCRIPTION |
---|---|
MFC版本.DLL | MFC DLL、ANSI 或 MBCS 发布版本 |
MFC版本U.DLL | MFC DLL、Unicode 发布版本 |
MFC版本D.DLL | MFC DLL、ANSI 或 MBCS 调试版本 |
MFC版本UD.DLL | MFC DLL、Unicode 调试版本 |
MFCM版本.DLL | 具有 Windows 窗体控件、ANSI 或 MBCS 发布版本的 MFC DLL |
MFCM版本U.DLL | 具有 Windows 窗体控件的 MFC DLL、Unicode 发布版本 |
MFCM版本D.DLL | 具有 Windows 窗体控件、ANSI 或 MBCS 调试版本的 MFC DLL |
MFCM版本UD.DLL | 具有 Windows 窗体控件的 MFC DLL,Unicode 调试版本 |
生成使用这些共享 DLL 的应用程序或 MFC 扩展 DLL 所需的导入库与 DLL 具有相同的基本名称,但扩展名为 .lib。 使用共享 DLL 时,小型静态库仍必须与代码链接;此库名为 MFCS版本{U}{D}.lib。
如果要动态链接到 MFC 的共享 DLL 版本(无论是来自应用程序还是 MFC 扩展 DLL),则必须在部署产品时包括匹配的 MFC版本.DLL或 MFC版本U.DLL。
有关可与应用程序一起分发的 Visual C++ DLL 的列表,请参阅适用于 Microsoft Visual Studio 2017 和 Microsoft Visual Studio 2017 SDK(包括实用工具和 BuildServer 文件)或 Visual Studio 2019的可分发代码。
有关 MFC 中的 MBCS 和 Unicode 支持的详细信息,请参阅 Unicode 和多字节字符集(MBCS)支持。
动态链接库支持
可以使用静态或共享动态 MFC 库创建 MFC 可执行文件可以使用的 DLL。 这些 DLL 称为“常规 DLL”或“常规 MFC DLL”,以将它们与 MFC 扩展 DLL 区分开来,这些 DLL 只能由 MFC 应用和 MFC DLL 使用。 使用 MFC 静态库生成的 DLL 有时在旧引用中称为 USRDLL,因为 MFC DLL 项目定义预处理器符号 _USRDLL。 使用 MFC 共享 DLL 的 DLL 有时在较旧的引用中称为 AFXDLL,因为它定义了预处理器符号 _AFXDLL。
通过链接到 MFC 静态库创建 DLL 项目时,无需 MFC 共享 DLL 即可部署 DLL。 当 DLL 项目链接到导入库 MFC版本时。LIB 或 MFC版本U.LIB,必须与 DLL 一起部署匹配的 MFC 共享 DLL MFC版本.DLL或 MFC版本U.DLL。 有关详细信息,请参阅 DLL。