文章目录
- 一、完成一个简单的MFC程序
-
- 1.创建一个MFC程序
- 2.MFC程序的功能实现
- 二、环境变量的搭建
- 三、用命令行工具cl.exe,linker.exe Windows API 程序
- 四、用命令行工具cl.exe,linker.exe 编译链接MFC程序
- 五、总结
- 六、参考资料
一、完成一个简单的MFC程序
1.创建一个MFC程序
使用工具:Visual Studio 2019
(1)打开vs2019,创建一个新的MFC项目
如果没有MFC应用选项,则先进入编辑界面点击工具获取工具和功能
选择MFC
(2)配置新项目,选择项目名称及存放位置
(3)应用程序类型选择基于对话框,然后点完成
(4)完成后,在资源视图中找到如下路径点击IDD_TEST1_DIALOG
(5)点击之后可以用工具箱设计图形界面
(6)我设计的界面如下
2.MFC程序的功能实现
要实现的功能:点击关闭界面按钮界面关闭
(1)右键点击按钮选择添加时间处理程序
(2)消息类型选择BN_CLICKED
(3)此时将会跳转进如下函数块
(4)在其中加入如下代码
UINT i;i = MessageBox(TEXT("确认要退出程序吗?"), TEXT("温馨提示"), MB_YESNO | MB_ICONQUESTION);if (i == IDNO){
return;}
(5)点击运行即可实现该功能
二、环境变量的搭建
1.环境变量的配置
(1)右键点击此电脑,点击属性,选择高级系统设置
(2)选择环境变量
(3)添加环境变量
①将
D:\vs2019\VC\Tools\MSVC\14.27.29110\bin\Hostx64\x64
添加进PATH
②新建一个用户变量INCLUDE
将
D:\vs2019\VC\Tools\MSVC\14.27.29110\include
F:\Windows Kits\10\Include\10.0.18362.0\cppwinrt
F:\Windows Kits\10\Include\10.0.18362.0\shared
F:\Windows Kits\10\Include\10.0.18362.0\ucrt
F:\Windows Kits\10\Include\10.0.18362.0\um
F:\Windows Kits\10\Include\10.0.18362.0\winrt
添加进新建的INCLUDE中
③新建一个用户变量LIB
将
D:\vs2019\VC\Tools\MSVC\14.27.29110\lib\x64
F:\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64
F:\Windows Kits\10\Lib\10.0.18362.0\um\x64
F:\Windows Kits\10\Lib\10.0.18362.0\ucrt_enclave\x64
添加进LIB
(4)查看是否配置成功
进入控制台,输入cl,出现以下内容即说明配置成功
点击查看配置环境变量的详细过程
三、用命令行工具cl.exe,linker.exe Windows API 程序
使用的Window API程序:一个简单的windows窗口程序
(1)进入命令窗口并进入到该程序所在目录
(2)使用cl.exe编译
所用命令
cl /c /D "UNICODE" /EHsc 第一个windows窗口程序.cpp
各个标识的意思
/c:只编译不链接
/D “UNICODE”:使用unicode编码处理程序中的字符串
/EHsc:使用C++中的异常
如图所示说明编译成功
(3)这时文件夹中会出现一个.obj文件
(4)直接链接会出错,先打开vs,点击 项目→属性,复制附加依赖项的内容
(5)输入链接命令
link 第一个Windows窗口程序.obj kernel32.lib user32.lib;gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
复制粘贴下来的依赖项要删除%(…)的内容,并将分号换成空格。
(6)如图所示,说明链接成功
(7)这时目录下会出现一个.exe文件,打开即可运行程序
(8)运行程序
四、用命令行工具cl.exe,linker.exe 编译链接MFC程序
(1)编译MFC程序需要再引入环境变量
将D:\vs2019\VC\Tools\MSVC\14.27.29110\atlmfc\include加入INLCUDE
将D:\vs2019\VC\Tools\MSVC\14.27.29110\atlmfc\lib加入LIB
(2)在源程序中添入入口函数代码
VS生成的程序,没有可识别入口函数,需要手动添加一个函数,这样link多个cpp文件时才能正确找到入口函数
具体添加代码如下
extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow);extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{
// call shared/exported WinMainreturn AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);int nReturnCode = -1;CWinThread* pThread = AfxGetThread();CWinApp* pApp = AfxGetApp();// AFX internal initializationif (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))goto InitFailure;// App global initializations (rare)if (pApp != NULL && !pApp->InitApplication())goto InitFailure;// Perform specific initializationsif (!pThread->InitInstance()){
if (pThread->m_pMainWnd != NULL){
TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");pThread->m_pMainWnd->DestroyWindow();}nReturnCode = pThread->ExitInstance();goto InitFailure;}nReturnCode = pThread->Run();InitFailure:
#ifdef _DEBUG// Check for missing AfxLockTempMap callsif (AfxGetModuleThreadState()->m_nTempMapLock != 0){
TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",AfxGetModuleThreadState()->m_nTempMapLock);}AfxLockTempMaps();AfxUnlockTempMaps(-1);
#endifAfxWinTerm();return nReturnCode;
}
(3)开始用cl编译cpp文件
一共有三个cpp文件,编译第一个
编译第二个
编译第三个
文件夹中出现三个.obj文件
(4)将三个obj文件链接到一起
link TEST1.obj pch.obj TESTDlg.obj
(5)成功,可以看到可执行文件
(6)运行程序
五、总结
这次实验让我了解了如何在命令窗口中使用cl.exe,linker.exe实现编译链接程序,在操作过程中出现了许多问题,大部分都是由于没有正确配置环境变量造成的。其次我认为MFC程序在使用上相对于WINDOWS API程序来说我感觉方便了很多。
六、参考资料
1.VS2017加装MFC以及创建第一个MFC程序.
2.在Windows命令行中使用cl.exe——如何设置环境变量
3.如何使用cl.exe和linker.exe编译链接Windows API程序和MFC程序.