MFC 库版本

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 库等。

ANSI、MBCS 和 Unicode

MFC ANSI/MBCS 库版本支持单字节字符集(如 ASCII)和多字节字符集(如 Shift-JIS)。 MFC Unicode 库版本支持采用其 UTF-16LE 宽字符编码形式的 Unicode。 使用 MFC 的 ANSI/MBCS 库版本可实现 UTF-8 编码 Unicode 支持。

若要将项目配置设置为在 IDE 中使用单字节、多字节或宽字符 Unicode 字符串和字符支持,请使用“项目属性”对话框。 在“配置属性”>“常规”页中,将“字符集”属性设置为“未设置”可使用单字节字符集。 将属性设置为“使用多字节字符集”可使用多字节字符集,或设置为“使用 Unicode 字符集”可使用编码为 UTF-16 的 Unicode

MFC 项目使用预处理器符号 _UNICODE 指示 UTF-16 宽字符 Unicode 支持,使用 _MBCS 指示 MBCS 支持。 这些选项在项目中是互斥的。

MFC 静态库命名约定

MFC 的静态库使用以下命名约定。 库名采用以下格式

uAFXcd.LIB

其中,使用斜体小写字母形式显示的字母是说明符的占位符,下表中显示了说明符的含义:

说明符 值和含义
u ANSI/MBCS (N) 或 Unicode (U);对于对话框中没有 MFC 控件的版本会省略
c 对话框中具有 MFC 控件的版本 (CW),或没有这些控件的版本 (NMCD)
d 调试或发布:D 表示调试;省略说明符表示发布

对于支持的生成体系结构,下表中列出的所有库包含在 \atlmfc\lib 目录中并进行了预生成。

说明
NAFXCW.LIB MFC 静态链接库,发布版本
NAFXCWD.LIB MFC 静态链接库,调试版本
UAFXCW.LIB 具有 Unicode 支持的 MFC 静态链接库,发布版本
UAFXCWD.LIB 具有 Unicode 支持的 MFC 静态链接库,调试版本
AFXNMCD.LIB 没有 MFC 对话框控件的 MFC 静态链接库,发布版本
AFXNMCDD.LIB 没有 MFC 对话框控件的 MFC 静态链接库,调试版本

具有相同基名称和 .pdb 扩展名的调试器文件也可用于每个静态库。

MFC 共享 DLL 命名约定

MFC 共享 DLL 也遵循结构化命名约定。 这样可更轻松地了解应将哪些 DLL 或库用于哪种用途。

MFC DLL 具有指示二进制文件兼容性的版本号。 可使用与其他库和编译器工具集具有相同版本的 MFC DLL 来保证项目中的兼容性。

DLL 说明
MFCversion.DLL MFC DLL、ANSI 或 MBCS 发布版本
MFCversionU.DLL MFC DLL、Unicode 发布版本
MFCversionD.DLL MFC DLL、ANSI 或 MBCS 调试版本
MFCversionUD.DLL MFC DLL、Unicode 调试版本
MFCMversion.DLL 具有 Windows 窗体控件的 MFC DLL,ANSI 或 MBCS 发布版本
MFCMversionU.DLL 具有 Windows 窗体控件的 MFC DLL,Unicode 发布版本
MFCMversionD.DLL 具有 Windows 窗体控件的 MFC DLL,ANSI 或 MBCS 调试版本
MFCMversionUD.DLL 具有 Windows 窗体控件的 MFC DLL,Unicode 调试版本

生成使用这些共享 DLL 的应用程序或 MFC 扩展 DLL 所需的导入库具有与 DLL 相同的基名称,但文件扩展名为 .lib。 使用共享 DLL 时,仍必须将一个小型静态库与代码链接;此库名为 MFCSversion{U}{D}.lib

如果要动态链接到 MFC 的共享 DLL 版本,无论是来自应用程序还是 MFC 扩展 DLL,都必须在部署产品时包含匹配的 MFCversion.DLL 或 MFCversionU.DLL

有关可与应用程序一起分发的 Visual C++ DLL 的列表,请参阅 Microsoft Visual Studio 2017 和 Microsoft Visual Studio 2017 SDK 的可分发代码(包括实用程序和 BuildServer 文件)Visual Studio 2019 的可分发代码

有关 MFC 中的 MBCS 和 Unicode 支持的详细信息,请参阅 Unicode 和多字节字符集 (MBCS) 支持

可以使用静态或共享动态 MFC 库创建可由 MFC 和非 MFC 可执行文件使用的 DLL。 这些 DLL 称为“规则 DLL”或“规则 MFC DLL”,用于将它们与 MFC 扩展 DLL(只能由 MFC 应用和 MFC DLL 使用)区分开来。 使用 MFC 静态库生成的 DLL 有时在较旧引用中称为 USRDLL,因为 MFC DLL 项目会定义预处理器符号 _USRDLL。 使用 MFC 共享 DLL 的 DLL 有时在较旧引用中称为 AFXDLL,因为它会定义预处理器符号 _AFXDLL

通过链接到 MFC 静态库来创建 DLL 项目时,无需 MFC 共享 DLL 即可部署 DLL。 当 DLL 项目链接到导入库 MFCversion.LIB 或 MFCversionU.LIB 时,必须将匹配的 MFC 共享 DLL MFCversion.DLL 或 MFCversionU.DLL 与你的 DLL 一起部署。 有关详细信息,请参阅 DLL

另请参阅

常规 MFC 主题