1. 目录结构介绍

Build32.bat和Build64.bat分别是32位和64位的编译脚本。 CMakeMFC1/CMakeMFC1/CMakeLists.txt 是MFC程序的CMake编译脚本。 CMakeMFC1.cpp CMakeMFC1.h CMakeMFC1.rc CMakeMFC1Dlg.cpp CMakeMFC1Dlg.h Resource.h stdafx.cpp stdafx.h targetver.h 以及CMakeMFC1.ico CMakeMFC1.rc2是用VisualStudio的MFC向导生成对话框源程序产生的代码。 CMakeMFC1/CMakeLists.txt是最外层的CMake编译脚本,当需要编译多个程序的时候,在此处修改。

源代码参考:

2. CMakeLists.txt的详细说明

下面对 CMakeMFC1/CMakeMFC1/CMakeLists.txt 进行详细说明。

#设置需要的CMake的最低版本
cmake_minimum_required(VERSION 3.0)
#设置工程名称
project(CMakeMFCDemo1Test)

#CMAKE_MFC_FLAG参数的意思是这样解释的:

#To use MFC, the CMAKE_MFC_FLAG variable must be set as follows:
#为了使用MFC,CMAKE_MFC_FLAG需要设置为以下的值

# 0: Use Standard Windows Libraries
# 0: 使用标准的Windows库

# 1: Use MFC in a Static Library
# 1:在静态库中使用MFC
# 2: Use MFC in a Shared DLL

# 2: 在共享库中使用MFC
# set(CMAKE_MFC_FLAG 2)

# 需要增加这一条,具体原因不清楚
ADD_DEFINITIONS(-D_AFXDLL)

# 在共享库中使用MFC
SET(CMAKE_MFC_FLAG 2)

# 设置源文件
SET(SOURCE_FILE ./stdafx.h ./targetver.h ./stdafx.cpp ./Resource.h 
                ./CMakeMFC1Dlg.h ./CMakeMFC1Dlg.cpp
                ./CMakeMFC1.h ./CMakeMFC1.cpp)

# 设置资源文件
SET(RC_FILE ./CMakeMFC1.rc ./res/CMakeMFC1.ico ./res/CMakeMFC1.rc2)

if(CMAKE_CL_64)
    #设置64位的程序目标(可执行程序)输出路径
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../../bin/Debug64/)     
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../../bin/Release64/) 
else()
    #设置32位的程序目标(可执行程序)输出路径
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/../../bin/Debug32/)     
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_SOURCE_DIR}/../../bin/Release32/) 
endif()

#设置可执行程序的文件名,注意此处有WIN32表示是一个Win32的GUI程序
add_executable(MFCDemo1 WIN32 ${SOURCE_FILE} ${RC_FILE})

此CMakeLists.txt需要注意的地方有

需要增加以下两条针对MFC的设置

# 需要增加这一条,具体原因不清楚
ADD_DEFINITIONS(-D_AFXDLL)

# 在共享库中使用MFC
SET(CMAKE_MFC_FLAG 2)

需要增加针对Win32的程序设置

#设置可执行程序的文件名,注意此处有WIN32表示是一个Win32的GUI程序(程序的入口不同,WIN32的入口函数不是main(int argc,char * argv[]) )
add_executable(MFCDemo1 WIN32 ${SOURCE_FILE} ${RC_FILE})

3.编译脚本介绍

此处的编译脚本与前两篇的编译脚本类似,注意的地方是 MSBuild.exe之后的文件名,需要和CMakeMFC/CMakeLists.txt的 Project 的设置相对应。

mkdir Build32

cd Build32

cmake ../CMakeMFC1

MSBuild.exe CMakeMFCDemo1.sln -property:Configuration=Debug
MSBuild.exe CMakeMFCDemo1.sln -property:Configuration=Release
cd ..
cd bin
cd Debug32
MFCDemo1.exe

4.编译后的结果

图中红色的方框里就是编译出的结果。中间文件都在Build32目录下,这样源代码和中间的编译结果彻底的分开了。

MFC的运行结果