转载请注明出处。https://rhirufxmbcyj.gitlab.io
建立CMake目录,编写CMakeLists.txt
1 | 目录结构 |
- 外层CMakeLists.txt
1 | cmake_minimum_required(VERSION 2.8) |
关于CMAKE_MFC_FLAG官网的解释
It should be set to 1 for the static MFC library, and 2 for the shared MFC library.
- src中的CMakeLists.txt
1 | FILE(GLOB SRC_FILES "./*.cpp") |
1、由于CMake生成的MFC是空工程,里边的.h .cpp .rc文件都需要我们手动添加
2、直接创建出来的会报无法解析的外部符号_main,是因为创建默认为控制台程序,给它设置成windows类型就OK了。MFC程序的winmain是由系统调用的,无需我们关心。
生成VS工程
这时在build目录里边使用cmake ..命令则会报错,因为src里一个代码文件也没有,所以这时就先在src里手动创建一个main.cpp文件,不需要写任何东西,再cmake ..就成功创建工程了。
在VS工程中,对test项目增加一个资源,然后添加一个对话框,双击一下对话框上的按钮自动生成了MFC Dlg的代码文件 testDlg.cpp & .h,在.h文件中包含我们的资源文件头文件”resource.h”。
由于在VS里创建的文件都创建到了build文件夹里,我们还需要把他们拷贝到cmake的src目录里,从build->src中把 .rc .cpp *.h拷贝到根目录的src文件夹中,删掉当时为了占位的main.cpp,再次进入build中进行cmake ..命令。
这时候构建test工程,我们发现构建成功了,但是运行时崩在了系统的AfxWinMain函数内部。
解决运行崩溃的BUG
搜索AfxWinMain的函数实现发现,这个函数中调用了CWInApp中的InitInstance,而这个InitInstance在CWInApp中是虚函数,所以就需要继承自CWinApp的类去实现这个InitInstance函数了,而我们cmake创建出来的只有一个Dialog的类,缺了这一个CwinApp的类。
手动用VS创建一个MFC的工程test发现,不仅创建了CtestDlg类,还创建了CtestApp类,而这个CtestApp类就是继承自CWInApp,并且在CtestApp中的InitInstance函数中还对CtestDlg调用了DoModal显示Dialog窗口。
既然是自动生成的,应该是这两个文件能直接用,将CtestApp的 .h文件和.cpp文件拷贝到我们的src目录中,修改类名(不修改也行 直接用CtestApp类名),修改cpp中包含的头文件,改成我们的*Dlg.h,修改InitInstance函数中dlg的类名为我们的Dialog类。
编译。运行。成功。