如何在Visual Studio 2019的CMake Ninja项目中构建MFC共享库?
如何用纯CMake构建依赖MFC的C++库?
问题场景
现有C++项目结构如下:
mfc_ninja ├── CMakeLists.txt ├── source.cpp
初始CMake配置:
cmake_minimum_required(VERSION 3.19) project(mylib) add_definitions(-D_AFXDLL) set(CMAKE_MFC_FLAG 2) add_library(${PROJECT_NAME} SHARED source.cpp)
source.cpp仅包含#include <afxwin.h>,使用Visual Studio 2019构建时出现错误:
Error C1083 Cannot open include file: 'afxwin.h': No such file or directory
尝试改用FindMFC模块后,CMake输出显示未找到MFC,且REQUIRED参数未终止配置:
cmake_minimum_required(VERSION 3.19) project(mylib) find_package(MFC REQUIRED) message(STATUS "MFC_FOUND: ${MFC_FOUND}") add_library(${PROJECT_NAME} SHARED source.cpp)
输出:
1> [CMake] -- Looking for MFC 1> [CMake] -- Looking for MFC - not found 1> [CMake] -- MFC_FOUND: NO
解决方案
1. 确认Visual Studio已安装MFC组件
默认情况下Visual Studio不会自动安装MFC支持,需手动添加:
- 打开Visual Studio Installer,选择对应VS版本的「修改」选项
- 切换到「单个组件」标签,找到并勾选「MFC和ATL支持(x86和x64)」
- 点击「修改」完成安装
2. 正确配置CMake脚本
使用以下CMakeLists.txt配置,可正确构建依赖MFC的共享库:
cmake_minimum_required(VERSION 3.19) project(mylib) # 设置MFC链接方式:2为动态链接(对应_AFXDLL宏),1为静态链接 set(CMAKE_MFC_FLAG 2) # 查找MFC,REQUIRED会在找不到时终止CMake配置 find_package(MFC REQUIRED) # 创建共享库目标 add_library(${PROJECT_NAME} SHARED source.cpp) # 链接MFC依赖库,FindMFC模块会自动设置MFC_LIBRARIES变量 target_link_libraries(${PROJECT_NAME} PRIVATE ${MFC_LIBRARIES})
关键说明
CMAKE_MFC_FLAG必须在find_package(MFC)之前设置:该变量告诉CMake查找动态还是静态版本的MFC库,若未设置,FindMFC模块无法正确定位MFC资源。- 无需手动添加
_AFXDLL宏:设置CMAKE_MFC_FLAG 2后,CMake会自动为目标添加_AFXDLL预定义宏,无需再用add_definitions手动添加。 target_link_libraries的作用:将MFC的头文件路径、库路径及依赖库自动关联到目标,解决编译时找不到afxwin.h和链接错误的问题。
内容的提问来源于stack exchange,提问作者Benjamin Buch
相关产品推荐
相关产品推荐

