VS2019创建MFC窗口程序及用cl.exe和link.exe编译链接Windows API程序和MFC程序

一、创建MFC窗口程序

1、1 打开VS2019,创建新项目。这里我们先搜索MFC,找到后双击进入创建
在这里插入图片描述
双击后进入,这个界面,完成项目名称和储存位置后,点击创建
在这里插入图片描述
然后在这个界面,根据自己的项目需求,进行程序的设置更改,然后点击完成即可完成创建。
在这里插入图片描述

1.2

这里说一个小插曲:由于很多人安装VS的时候,没有刻意的去注意MFC应用编译在哪里,所以可能在第一步直接搜索MFC的时候找不到相关应用,如果找不到MFC的应用,看下下面的步骤:

1.2.1 在自己的电脑上找到VS Installer 然年双击运行
在这里插入图片描述
1.2.2 然后在这个界面,点击更多,找到修改,点击进去
在这里插入图片描述
1.2.3 然后就开始选择需要下载的功能应用,其他的需要的功能也是在这里面下载安装。等待下载安装后。重新启动程序即可。
在这里插入图片描述

2.1 程序设计(这里我们就看看原始生成的对话框程序 _ 这部分不重要_
在这里插入图片描述
2.2 原始的窗口程序结果界面,这就是最基础的窗口程序。(菜鸡这里就先不讲如何实现窗口程序的其他功能,见谅_
在这里插入图片描述

二、命令行工具cl.exe、linker.exe

1、环境配置

1.1 在使用cl.exe之前,需要进行环境配置。
这里先讲解如何进行环境配置
1.1.1桌面找到自己的电脑,然后单击右键,点击属性进入。
在这里插入图片描述
1.1.2 进入这个界面后,单击高级系统设置

在这里插入图片描述
1.1.3 点击环境变量进入环境变量配置。
在这里插入图片描述
在这里插入图片描述
1.1.4 如果想要查看或更改存在的环境变量,双击进入即可,就可以看见里面的信息,然后旁边有创建删除等功能。
在这里插入图片描述
如果想创建配置新的环境变量,直接点击新建,就会出现下面的窗口,然后输入自己要配置的变量名,然年输入变量值,其中可以一次输入多个变量值,中间用分号隔开,就可以一次性创建。
在这里插入图片描述

这里将展示换进配置的实例

1.2 Path环境变量配置
1.2.1 先在电脑文件搜索找到 cl.exe和link.exe 文件的路径,然后添加到系统变量Path中

目的:方便命令行找到,否则将会报错: " cl 不是内部或外部命令,也不是可运行的程序 或批处理文件"

F:\Visual Studio\VC\Tools\MSVC\14.27.29110\bin\Hostx86\x86

这是我的文件路径,我安装在F盘的,如果你是安装在其他硬盘的,路径也大同小异。 复制 下来。然后 新建,复制地址,再点击确定。

在这里插入图片描述
1.2.2 INCLUDE环境配置

在在变量名处填:INCLUDE
在变量值处填:(换成你的电脑上VS所在目录即可)(5个路径,中间用分号隔开,可一次性创建)

C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\winrt
F:\Visual Studio\VC\Tools\MSVC\14.27.29110\include

在这里插入图片描述
在这里插入图片描述
1.2.3 LIB环境配置
在在变量名处填:LIB
在变量值处填:

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x86
F:\Visual Studio\VC\Tools\MSVC\14.27.29110\lib\x86

方法和INCLUDE环境配置一样,这里就不展示了。

2、cl.exe,linker.exe编译链接MFC窗口程序

2.1 环境变量的配置

需将 MFC 的 include 文件和 lib 文件分别添加到系统变量 INCLUDE 和 LIB 中,否则又会报 “什么头文件找不到的错”
这就是典型的错误
在这里插入图片描述

需要分别找到 MFC 的 include 文件和 lib 文件地址
添加到INCLUDE环境变量中:

F:\Visual Studio\VC\Tools\MSVC\14.27.29110\atlmfc\include

添加到LIB环境变量中:

F:\Visual Studio\VC\Tools\MSVC\14.27.29110\atlmfc\lib\x86

2.2 编译 MFCA1.cpp ,MFCA1Dlg.cpp文件

F:\VSmy\MFCA1>cl /c /EHsc MFCA1.cpp
F:\VSmy\MFCA1>cl /c /EHsc MFCA1Dlg.cpp

没有报错,像这样就是编译成功
在这里插入图片描述

这时,就可以去看MFCA1文件中,就会生成两个OBJ文件
(这里是做好后截图,所以已经生成了OBJ文件,正常情况是要编译后才会有)
在这里插入图片描述
2.3 链接 MCFA1.obj 和MCFA1Dlg.obj文件(这里的文件不一样是我前面遇到的问题,后面解决后我重新创建的MFCA1文件)
在这里插入图片描述
这里主要是想说一下这个问题:

必须定义程序的入口?为啥直接用 VS2017 就没有报这个错?这是什么原因呢?
控制台程序的入口是 main()函数,窗口程序的入口是 WinMain() 函数。
那为啥在MFC项目中没有看见 WinMain() 函数呐?其实被编译器给隐藏了,WinMain()函数的具体位置可参考:MFC中的WinMain()入口去哪里了?VS2017在链接执行时其实会自动调用 appmodul.cpp 和 winwain.cpp 文件

2.4 然而用命令行链接就没有那么高级了,他不会自动帮你查找,所以需要自己添加一个入口,修改 MFCA1.cpp 文件,把下面的代码粘贴到MFCA1.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 WinMain
	return 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 initialization
	if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
		goto InitFailure;

	// App global initializations (rare)
	if (pApp != NULL && !pApp->InitApplication())
		goto InitFailure;

	// Perform specific initializations
	if (!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 calls
	if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
	{
		TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",
			AfxGetModuleThreadState()->m_nTempMapLock);
	}
	AfxLockTempMaps();
	AfxUnlockTempMaps(-1);
#endif

	AfxWinTerm();
	return nReturnCode;
}

2.5 经过上面的一系列操作,link MFCA1的两个OBJ文件英高没有问题。但是呢,由于我们前面的窗口程序中有资源文件存在。然后直接link的话是会报错的。(额,那个错误我忘记截图,不过问题不大)

这里直接上解决方法:
需要在自己的电脑上找到 rc.exe文件的路径添加到Path环境配置中

F:\Visual Studio\SDK\ScopeCppSDK\vc15\SDK\bin

2.6 然后需要先对rc.exe 和MFCA1.rc进行编译。编译后会生成MFCA1.res文件

F:\VSmy\MFCA1>rc.exe MFCA1.rc

在这里插入图片描述
2.7 至此,所有的配置问题都完成了,然后重新链接 MFCA1.obj 和MFCA1Dlg.obj 以及MFCA1.res文件

link MFCA1.obj MFCA1Dlg.obj MFCA1.res

去看文件目录里就会生成一个MFCA1.exe文件

在这里插入图片描述
点击MFCA1.exe文件,效果如下:
在这里插入图片描述

3、cl.exe,linker.exe编译链接Windows API程序

3.1 编译 WindowsProject2.c 程序:

F:\VSmy\WindowsProject2\WindowsProject2>cl /c /EHsc WindowsProject2.cpp

没有错误。就是编译成功,如下
在这里插入图片描述
3.2 链接 WindowsProject.c 程序:
如果直接 link WindowsProject.obj 将会出现如下错误:在这里插入图片描述
解决方法如下:
进入项目程序点击:“项目 —> 属性 —> 链接器 —> 输入”:
在这里插入图片描述
在这里插入图片描述
3.3 使用命令linker.exe

F:\VSmy\WindowsProject2\WindowsProject2>link WindowsProject2.obj WindowsProject2.res kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

注意:复制粘贴下来的依赖项要删除红色方框内容以及分号

3.4 到此链接APIiu成功了,会在文件里生成一个WindowsProject2.exe文件
在这里插入图片描述
程序运行如下:
在这里插入图片描述

三、参考资料

优秀博主博客:https://blog.csdn.net/ssj925319/article/details/109033576
https://blog.csdn.net/xwmrqqq/article/details/109018669

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
引用:VS2017 MFC 实测打包流程,可以实现MFC程序打包,并在其它机台上没有安装VS也可以正常运行。引用:注意如果删除pch.cpp会报下面错误,建议保留。引用[4]:今天我们编写简单的MFC窗口文件,使用软件VS2017。然后是vs2017的cl.exelink.exe编译连接。下面省略安装vs2017安装过程。 要使用VS2017编写MFC程序,你可以按照以下步骤进行操作: 1. 打开Visual Studio 2017并创建一个新的项目。选择“Visual C++”文件夹,然后选择“MFC”项目类型。 2. 在项目设置中,选择“应用程序类型”为“对话框”,然后点击“确定”按钮创建项目。 3. 在项目中,你可以添加自定义的控件和功能。你可以在C++代码中实现这些功能,并在资源视图中编辑对话框。 4. 在编写完代码后,你可以使用VS2017的cl.exelink.exe工具来编译链接MFC程序。可以使用cl.exe编译源代码文件,然后使用link.exe链接生成的目标文件和库文件。 5. 最后,你可以运行程序并查看结果。你可以在其他机器上运行程序,即使没有安装VS2017,也可以正常运行,这是因为在打包流程中包含了必要的依赖项和库文件。 需要注意的是,如果删除了pch.cpp文件,可能会导致错误,建议保留该文件。此外,记得在编写MFC窗口程序时,要使用VS2017的cl.exelink.exe工具进行编译链接。这样,你就可以使用VS2017来开发和运行MFC程序了。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值