项目

一般

简介

行为

错误 #449

打开

cmake MFC

李立奎3 个月 之前添加. 更新于 3 个月 之前.

状态:
新建
优先级:
普通
指派给:
-
开始日期:
2025-10-12
计划完成日期:
% 完成:

0%

预期时间:
#2:

描述

在 CMake 中配置 MFC(Microsoft Foundation Classes)项目,只需在 CMakeLists.txt 中设置 CMAKE_MFC_FLAG 变量即可控制链接方式:

  • 设置为 1 → 静态链接 MFC(生成的 exe 体积大,但无额外 DLL 依赖)
  • 设置为 2 → 动态链接 MFC(exe 体积小,目标机器需带 MFC 运行库)

最小可运行示例(动态链接):

cmake_minimum_required(VERSION 3.10)
project(mfc_demo)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_MFC_FLAG 2)          # 2=共享DLL,1=静态库
add_executable(mfc_demo WIN32  # WIN32 表示 GUI 子系统
    mfc_demo.cpp
)
# 必要的宏
target_compile_definitions(mfc_demo PRIVATE
    _WINDOWS _UNICODE UNICODE _AFXDLL)
# 入口点
target_link_options(mfc_demo PRIVATE /ENTRY:wWinMainCRTStartup)

源码 mfc_demo.cpp 示例:

#include <afxwin.h>            // MFC 核心头
class CMyApp : public CWinApp {
    BOOL InitInstance() override {
        CFrameWnd* p = new CFrameWnd;
        p->Create(nullptr, _T("CMake+MFC"));
        m_pMainWnd = p;
        p->ShowWindow(SW_SHOW);
        return TRUE;
    }
} theApp;

生成 & 编译(需安装 VS 且勾选“C++ 桌面开发 + MFC”):

cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release

运行 build\Release\mfc_demo.exe 即可看到空白 MFC 窗口。

如需静态链接,只需把 CMAKE_MFC_FLAG 改为 1,并将运行时库同步为 /MT(d)(CMake 默认会根据标志自动处理,也可手动 target_compile_options 指定 /MT)。

行为 #1

李立奎 更新于 3 个月 之前

支持MFC 向导中的配置项

下面给出一份“CMake 版 MFC 向导配置项”速查表,把 Visual Studio 新建 MFC 工程时那几页向导里最常见的 7 组选项,逐条映射到 CMake 里应写的变量/命令。
以后用 CMake 生成 MFC 工程时,只要在下表找到对应行,把右侧代码拷进 CMakeLists.txt 即可,无需再手工进 IDE 改属性页。

VS 向导页 向导配置项 等效 CMake 写法 备注
应用程序类型 多文档 / 单文档 / 对话框 无直接变量,手动add_executable 的源文件换成向导生成的 *.cpp/*.rc 即可 CMake 不决定模板,只决定链接方式
MFC 用法 在共享 DLL 中使用 MFC set(CMAKE_MFC_FLAG 2) 2 = 动态链接,exe 小,目标机需装 VC++ Runtime
在静态库中使用 MFC set(CMAKE_MFC_FLAG 1) 1 = 静态链接,exe 大,无额外依赖
字符集 使用 Unicode 字符集 add_definitions(-DUNICODE -D_UNICODE) 与向导默认值保持一致
使用多字节字符集 不写即可(VS 默认 _MBCS 如需显式:-D_MBCS
应用程序类型 Windows 应用程序 (/SUBSYSTEM:WINDOWS) add_executable(MyApp WIN32 …) WIN32 关键字即指明子系统
公共头文件 MFC 标准头文件 无需额外设置 只要 #include <afxwin.h> 等即可
附加选项 ActiveX 控件支持 add_definitions(-D_AFXCTL) 仅当项目含 OCX 时才需要
Windows 套接字支持 target_link_libraries(MyApp ws2_32) 需要网络时再添加
OLE 复合文档支持 add_definitions(-D_AFX_OLE_SUPPORT) 需要 Ole 嵌入时再加
预编译头 使用预编译头 (stdafx.h) set(CMAKE_PCH_PROLOGUE "#include <afxwin.h>") set_target_properties(MyApp PROPERTIES COTIRE_ENABLE_PRECOMPILATION ON) 需先 include(cotire) 或 VS2019+ 内置 /Yu
运行时库 /MD(d) 或 /MT(d) CMAKE_MFC_FLAG 自动推导;如需强制: set_property(TARGET MyApp PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") CMake ≥ 3.15

最小可运行“对话框”示例(已含上表全部常用项):

cmake_minimum_required(VERSION 3.15)
project(MyMfcDlg CXX)

set(CMAKE_MFC_FLAG 2)                  # 共享 DLL
add_definitions(-DUNICODE -D_UNICODE)  # Unicode 字符集
add_definitions(-D_AFXDLL)             # 与 MFC DLL 链接

# 把向导生成的文件列出来
set(SRC
    MyMfcDlg.cpp
    MyMfcDlgDlg.cpp
    stdafx.cpp
    MyMfcDlg.rc
)

add_executable(MyMfcDlg WIN32 ${SRC})

# 如需预编译头(可选)
# include(cotire)
# cotire(MyMfcDlg)

生成与编译:

cmake -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release

运行后得到的 MyMfcDlg.exe 与用 VS 向导一键生成的二进制行为完全一致,但全部配置已用 CMake 脚本固化,可跨机器/CI 无差异重现。

行为

导出 Atom PDF