在Windows上通过CMak构建MFC项目示例如下:
首先使用VS2022创建一个对话框项目MFCApplication1,不做任何修改,然后将默认生成的文件:*.h, *.cpp, *.rc, *.ico拷贝到一个干净的目录下,如下图所示:

build.sh内容如下:
#! /bin/bash
if [ $HOSTTYPE != "x86_64" ]; then
echo_error "only support x86_64 architecture: current architecture: $HOSTTYPE"
fi
if [[ "$OSTYPE" != "msys" ]] && [[ "$OSTYPE" != "cygwin" ]]; then
echo_error "unsupported platform: $OSTYPE"
exit -1
fi
result_judgment()
{
rc=$?
if [[ ${rc} != 0 ]]; then
echo -e "\033[0;31mError: there are some errors in the above operation, please check: ${rc}\033[0m"
exit ${rc}
fi
}
echo_error()
{
echo -e "\033[0;31mError: $1\033[0m"
}
if [ $# != 1 ]; then
echo_error "requires a parameter: Release or Debug\n For example: $0 Debug"
exit -1
fi
if [ $1 != "Release" ] && [ $1 != "Debug" ]; then
echo_error "the parameter can only be Release or Debug"
exit -1
fi
mkdir -p target && cd target
cmake \
-G"Visual Studio 17 2022" -A x64 \
-DCMAKE_BUILD_TYPE=$1 \
-DCMAKE_CONFIGURATION_TYPES=$1 \
..
result_judgment
cmake --build . --target install --config $1 #--verbose
result_judgment
cd ../
echo -e "\033[0;32mbuild completed\033[0m"
CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.21.0)
project(MFCApplication1)
set(CMAKE_MFC_FLAG 1) # 1: use static MFC library; 2: use shared MFC library
message(STATUS "build type: ${CMAKE_BUILD_TYPE}")
if (${CMAKE_BUILD_TYPE} STREQUAL "Release")
# set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /W1 /Ox") # not recommended, use target_compile_options
message(STATUS "cmake_cxx_flags_release: ${CMAKE_CXX_FLAGS_RELEASE}")
else()
# set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 /Od") # not recommended, use target_compile_options
message(STATUS "cmake_cxx_flags_debug: ${CMAKE_CXX_FLAGS_DEBUG}")
endif()
message(STATUS "current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")
set(CMAKE_CXX_STANDARD 20) # C++20
set(INCLUDES
include
)
set(SRCS
src/MFCApplication1.cpp
src/MFCApplication1Dlg.cpp
src/pch.cpp
)
set(RESOURCES
src/MFCApplication1.rc
src/res/MFCApplication1.rc2
src/res/MFCApplication1.ico
)
# set install path
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/install/${CMAKE_BUILD_TYPE}" CACHE PATH "" FORCE)
message(STATUS "cmake_install_prefix: ${CMAKE_INSTALL_PREFIX}")
add_executable(${PROJECT_NAME} WIN32
${SRCS}
${RESOURCES}
)
target_include_directories(${PROJECT_NAME} PUBLIC ${INCLUDES})
target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE)
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<CONFIG:Debug>:/W4 /Od /MTd>
$<$<CONFIG:Release>:/W1 /Ox /MT>
)
source_group("Resource Files" FILES ${RESOURCES})
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})
编译、运行结果如下图所示:

说明:
1.CMAKE_MFC_FLAG:CMake的内置变量,用于对可执行文件或DLL启用MFC(Microsoft Foundation Classes)库。使用MFC静态库设置为1,使用MFC动态库库设置为2。此设置要与运行库匹配,即设置为1,则运行库为/MT或/MTd;设置为2,则运行库为/MD或/MDd。
2.add_executable中WIN32选项:不指定时入口点为main,生成控制台应用程序;指定时入口点为WinMain,生成GUI(MFC)应用程序。
3.target_compile_definitions中指定_UNICODE项:指定时字符集使用Unicode字符集,不指定时使用多字节字符集。不推荐使用add_definitions,它是全局设置。
4.可以通过内置变量CMAKE_CXX_FLAGS_RELEASE或CMAKE_CXX_FLAGS_DEBUG来查看编译选项,要想查看更详细更准确编译选项,可以在cmake时增加--version项。
5.可以通过target_compile_options设置编译选项,如警告等级、优化等级等。不推荐使用CMAKE_CXX_FLAGS_RELEASE或CMAKE_CXX_FLAGS_DEBUG,它们是全局设置。
4141

被折叠的 条评论
为什么被折叠?



