简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用
- 实验目标
- 实验流程
-
- 一、MFC程序
-
- 1.创建MFC项目
- 2.资源与代码
- 3.演示效果
- 二、编译连接windows API程序
-
- 1.设置环境变量
- 2.编译windows API程序
- 3.连接Windows API程序
- 三、编译连接MFC程序
-
- 1.设置环境变量
- 2.编译MFC程序
- 3.连接MFC程序
- 四、总结
- 五、参考
实验目标
- 完成一个简单的MFC程序。
- 用vs2017的命令行工具cl.exe、linker.exe等编译连接windows API程序和MFC程序。
实验流程
一、MFC程序
1.创建MFC项目
打开vs2017,【文件】→【新建】→【项目】
选择【MFC应用】,自己设置名称和位置,点击确定
然后一直下一步直至完成
2.资源与代码
在右侧的资源管理器中打开【源文件】目录,将文件删剩pch.cpp
右键【源文件】,选择添加MFCapp.cpp,并输入代码如下
#include "pch.h"//自定义窗口
class Cwin : public CFrameWnd
{
public:Cwin(){
Create(NULL, _T("MFC windows"), WS_OVERLAPPEDWINDOW, rectDefault);}
};// 定义应用程序类。
class CMFCApp : public CWinApp
{
public://程序入口virtual BOOL InitInstance();
};BOOL CMFCApp::InitInstance()
{
m_pMainWnd = new Cwin();m_pMainWnd->MoveWindow(450,250,400,300, FALSE); //设置窗口大小分别是宽,高,x,ySetWindowLong(m_pMainWnd->m_hWnd, GWL_STYLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU);m_pMainWnd->ShowWindow(m_nCmdShow); //显示窗口CDC* dc = m_pMainWnd->GetDC(); //绘图区CRect rect = CRect(0, 0, 450, 125); //背景覆盖范围dc->FillSolidRect(&rect, RGB(0, 255, 0)); //设置背景颜色dc->SetBkMode(TRANSPARENT); //当文不在背景色范围外时,使得文字本身不带背景色dc->TextOutW(0, 125, _T("Hello World")); //显示文字,分别是x,y,和显示内容m_pMainWnd->UpdateWindow(); //更新窗体return TRUE; //返回TRUE进入消息循环
}// 应用程序类实例
CMFCApp Cwin;
3.演示效果
点击调试运行
二、编译连接windows API程序
1.设置环境变量
桌面右键【此电脑】,选择【属性】,在系统面板中选择【高级系统设置】,然后在【高级】中点击【环境变量】
然后在环境变量中双击【Path】进入编辑界面,在文件夹中搜索【cl.exe】并将其路径复制下来
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
这是我将vs默认安装在c盘的路径
选择【新建】,将路径粘贴进去
点击确定后,在用户变量中点击【新建】
在【变量名】处填LIB
然后在【变量值】中填入以下4个地址
注意地址与地址之间用“;”隔开
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt_enclave\x64
同样的,在用户变量中新建变量,在【变量名】中填INCLUDE
然后在【变量值】中填入以下6个地址
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\cppwinrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt
设置完毕后点击确定即可
快捷键win+r打开运行对话框,打开cmd,输入cl命令后显示如下即环境配置成功。
2.编译windows API程序
所用到的Windows API程序:Windows API程序设计入门(一个简单的窗口)
找到winapp.c的文件夹,在路径处输入cmd,然后回车进入cmd界面
输入cl命令
cl /c /D "UNICODE" /EHsc winapp.c
显示如下,警告可以不管,而且没其他信息,即编译成功
文件夹中多了个.obj文件
3.连接Windows API程序
打开Windows API程序,点击【项目】→【属性】
在属性页中选择【链接器】→【输入】,双击【依赖项】并将其复制下来
复制下来的依赖项:
kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
执行link命令
(将“;”换成空格,并将最后的“%(AdditionalDependencies)”删去)
link winapp.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
显示如下即为连接成功
并在文件夹中生成了一个新的.exe文件
三、编译连接MFC程序
1.设置环境变量
同样的,右键【此电脑】,打开【高级系统设置】→【高级】→【环境变量】
将以下路径添加到INCLUDE中
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\include
将以下路径添加到LIB中
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64
2.编译MFC程序
新建一个MFC程序,将其命名为MFCapp2,在MFCapp的基础上,在末尾处加上下列代码
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;
}
在MFCapp2.cpp的文件夹中打开cmd
分别输入cl命令
cl /c /D "UNICODE" /EHsc MFCapp2.cpp
cl /c /D "UNICODE" /EHsc pch.cpp
编译成功
生成两个.obj文件
3.连接MFC程序
输入link命令,将两个.obj文件连接起来
link MFCapp2.obj pch.obj
连接成功
生成.exe文件
四、总结
经过一天的学习感觉上cl.exe和linker.exe使用起来难度不大,但是环境变量的配置极其复杂,若是在操作过程中出现失误,纠错起来很困难,而且不同的设备遇到任何问题都是不奇怪的,需要上网查阅许多资料来慢慢解决。
五、参考
Windows API和MFC的区别
一个最简单的MFC程序
如何使用cl.exe和linker.exe编译链接Windows API程序和MFC程序
Windows API和MFC的区别