使用cl.exe和linker.exe連線程式

ChYangZzz發表於2020-10-14

一、環境配置

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
在這裡插入圖片描述
執行結果
在這裡插入圖片描述

四、參考資料

https://blog.csdn.net/ssj925319/article/details/109033576

https://blog.csdn.net/weixin_43997331/article/details/104764873?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

相關文章