错误 #449
打开
由 李立奎 在 3 个月 之前添加.
更新于 3 个月 之前.
描述
在 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)。
支持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