文章目录
一、在vs2017下建立一个简单MFC应用程序
1.在vs2017下安装MFC环境
- 在vs installers下载相关组件
2.创建MFC项目工程
1新建一个MFC应用/MFC应用程序
2选择基于对话框
3点击
在工具栏里选择控件并放置
界面设计:
代码部分
void CMFC01Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
c = a + b;
UpdateData(FALSE);
// TODO: 在此添加控件通知处理程序代码
}
程序运行效果:
二、用vs2017的命令行工具cl.exe,linker.exe等编译连接windows API程序和MFC程序
1.设置环境变量
在Windows命令行中使用cl.exe——如何设置环境变量.
根据不同人的电脑,cl.exe的文件安装的位置不同, 查看VS2017编译器 cl.exe 位置.当然也可以用文件搜索来找
右键电脑→属性→高级系统设置
我的Path环境变量路径为:
D:\VS2017\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86
我的LIB环境变量路径为:
D:\VS2017\VC\Tools\MSVC\14.16.27023\lib\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x86
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt_enclave\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x86
我的INCLUDE环境变量路径为:
D:\VS2017\VC\Tools\MSVC\14.16.27023\include
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\cppwinrt
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
环境变量配置完毕!在cmd输入cl测试是否成功,配置成功截图如下
2.先用一个hello world的小程序测试一下
#include<iostream>
using namespace std;
int main() {
cout << "hello world" << endl;
return 0;
}
记得要在有当前.cpp的文件下,输入cmd,不然就是错误:c1xx: fatal error C1083: 无法打开源文件: “Project2.cpp”: No such file or directory
在cmd中输入cl Project2.cpp /EHsc & Project2.exe
生成结果如下:
在当前文件下就会生成两个新的文件,一个是exe,一个是obj
3.用命令行工具编译Windows API
由于Windows API使用vc6.0编写的,这里使用的vs2017,直接使用的是Windows桌面应用程序
在cmd里输入cl WindowsAPI.cpp /EHsc & WindowsAPI.exe
会出现大量的error link2019 和error link1120,解决方法:error LNK2019: 无法解析的外部符号
在cmd里输入cl /c /D "UNICODE" /EHsc WindowsAPI.cpp
只编译不连接
在当前文件下生成了WindowsAPI.obj文件
复制附加依赖项里
在cmd中输入
link WindowsAPI.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
此时当前文件夹下会出现WindowsAPI.exe,但此时双击这个exe的时候,并不能成功地运行起来
运行结果:
4.用命令工具行编译MFC程序
还是在当前MFC文件夹下,运行cmd
输入cl /c /D "UNICODE" /EHsc MFC01.cpp
只编译不连接
找到afxwin.h的头文件,添加到INCLUDE的环境变量之中,再次输入cl /c /D "UNICODE" /EHsc MFC01.cpp
此文件夹终究会出现MFC01.obj文件了
此处需添加一个入口函数,在MFC中是有main函数的,但是被微软隐藏起来了,所以自己要写一个入口函数去调用其他函数(理由大致是这样,本人不太能明白)
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;
}
同理还有MFC01Dlg.cpp和pch.cpp,生成obj文件
遇到模块计算机和目标计算机类型不同的问题,解决方法:Windows 64位 Visual Studio2017 “模块计算机类型“x64”与目标计算机类型“X86”冲突解决方案
在cmd里输入link MFC01.obj MFC01Dlg.obj pch.obj
就此,当前文件下生成了个MFC01.exe文件,但双击这个exe文件依旧运行不起来
运行效果:
三、总结
本次实验学习了MFC的使用,MFC就是一个类库,创建MFC应用程序的时候,大多的代码直接生成,我们只要创建控件,编写控件的函数即可,方便;而cl.exe和linker.exe是方便了代码的编译,不需要通过IDE再编译,但在配置环境变量的时候大量的问题出现,大多时间还是花费在环境变量配置上,其实还是不方便的说,而且link出来的exe文件并不能双击打开,不能解决此问题(遗留问题)。(本实验还是大量借鉴他人的经验)。
四、参考资料
基于MFC的程序以及命令行工具cl.exe,linker.exe实现编译链接
查看VS2017编译器 cl.exe 位置
VS2017实现简单的MFC窗口程序及用cl.exe和link.exe编译链接
如何使用cl.exe和linker.exe编译链接Windows API程序和MFC程序
在Windows命令行中使用cl.exe——如何设置环境变量
error LNK2019: 无法解析的外部符号
Windows 64位 Visual Studio2017 “模块计算机类型“x64”与目标计算机类型“X86”冲突解决方案