当前位置: 代码迷 >> 综合 >> 简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用
  详细解决方案

简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用

热度:63   发布时间:2024-02-28 14:23:11.0

简易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的区别

  相关解决方案