使用cl.exe和linker.exe连接程序
一、环境配置
1、在电脑桌面,右击此电脑,选择属性进入控制面板主页,点击高级系统设置。
2、点击环境变量进行设置
3、双击path变量
输入自己cl.exe文件所在位置
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\Hostx86\x86
如果找不到可以在文件中进行搜索。
4、添加其他环境变量
在变量名在变量名处填:LIB
在变量值处填:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64
再次点击新建,在变量名处填:INCLUDE
在变量值处填:C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include
做完这一切后,请点击确定,让系统配置生效。这时编译器可以找到iostream等基本的头文件,但因为缺少一些库还是不能运行。
找到windows kits
在刚刚创建的环境变量LIB中编辑文本,添加以下路径:
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt_enclave\x64
在刚刚创建的环境变量INCLUDE中编辑文本,添加以下路径:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\cppwinrt
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
在dos里输入cl如果出现下图所示就表示配置成功
5、创建一个简单文件检查是否可用
创建一个helloworld 控制台程序并在文件夹中用cmd来编译并运行它
表示编译成功,并且文件夹中出现C1.obj文件
二、创建一个WIN32程序并使用cl.exe 和linker.exe使其编译并运行
1、创建一个空的窗口项目并加入文件写入代码
2、保存所写代码文件不编译在文件中用cl.exe编译
文件中出现win1.obj文件
3、使用linker.exe连接哭文件并生成win1.exe文件
找到输入附加依赖项
找到需要的依赖库后再dos中输入正确命令
link win1.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
正确后会生成win1.exe文件
运行win1.exe
三、创建一个MFC程序并使用cl.exe 和linker.exe使其编译并运行
1、创建一个MFC程序
2、分别编译三个文件
编译第一个文件的时候报错
找到该文件的目录结尾为include所以把该地址放到INCLUDE环境变量中
重新打开cmd编译刚刚的文件
生成了3个obj文件。
使用link命令将三个文件链接起来
无法打开nafxc.lib,所以我们需要将这个文件的路径也添加到环境变量中
使用link会报一个错
在MFC_1.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;
}
重新编译一遍MFC_1.cpp然后进行链接
链接成功并且生成了MFC_1.exe
执行结果