使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式(入門練習)
- 實驗内容
- 實驗環境
- 環境配置
- 實驗步驟
-
- 1.指令行工具cl.exe,linker.exe編譯連結Window API程式
- 2.指令行工具cl.exe,linker.exe編譯連結MFC程式
- 總結
實驗内容
Visual Studio 2017的指令行工具cl.exe,linker.exe等編譯連接配接windows API程式和MFC程式。
windows API程式部落格連結
MFC程式連結
實驗環境
Visual Studio 2017
環境配置
-
進入環境變量編輯界面
控制台 → 系統 → 進階系統設定 → 環境變量
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 在上述界面中找到path并進行編輯
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 -
在電腦中找到cl.exe檔案,并複制其所在目錄
推薦使用Everything軟體進行搜素
D:\SOFTWARE\VS\VS\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86
點選建立,并将複制的目錄粘貼上,然後點選确定即可
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 再次編輯環境變量。在使用者變量内分别建立LIB與INCLUDE變量。
目錄根據個人軟體安裝位置而變
- 建立LIB環境變量
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 建立INCLUDE環境變量
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 在cmd控制台中輸入cl,若出現以下情況,則說明已經配置好環境
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結
實驗步驟
1.指令行工具cl.exe,linker.exe編譯連結Window API程式
Windows API程式部落格連結
- 在Windows API檔案目錄下運作cmd,并使用cl.exe編譯Windows API程式
cl /c /EHsc Test.cpp
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 使用指令linker.exe
link Test.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
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 輸出結果如下
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結
2.指令行工具cl.exe,linker.exe編譯連結MFC程式
MFC程式連結
MFC程式下有如下檔案
Visual Studio 2017中沒有可識别的程式入口,如果不重新定義則會出現錯誤:必須定義入口點。
定義完入口點後即可編譯3個源檔案
- 在1_MFC.cpp末尾添加以下函數作為入口點
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; }
- 在工程目錄下打開cmd并使用cl.exe編譯1_MFC.cpp
cl /c /EHsc 1_MFC.cpp
出現無法打開檔案錯誤是因為環境變量未添加完畢。使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 在檔案中找到afxwin.h檔案目錄,并将其所在目錄複制下來,添加到INCLUDE環境變量中
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 再次編譯1_MFC.cpp與剩下兩個源檔案
cl /c /EHsc 1_MFC.cpp
cl /c /EHsc 1_MFCDlg.cpp
出現以下畫面則表示成功編譯cl /c /EHsc pch.cpp
并可以工程目錄下看到多出來的三個.obj檔案使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 使用link連接配接上述3個.obj檔案
此時出現錯誤link 1_MFC.obj 1_MFCDlg.obj pch.obj
缺少nafxcw.lib檔案,該錯誤的解決方式與第3步相同,這裡不再說明使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 解決錯誤後再次link連接配接3個.obj檔案
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結 - 輸出結果
使用VS2017的指令行工具cl.exe、linker.exe編譯連接配接windows API程式和MFC程式實驗内容實驗環境環境配置實驗步驟總結
總結
cl.exe與linker.exe本身并不複雜,環境變量的配置才是本實驗的難點。在建立環境變量的時候要注意區分x64與x86,如果在此出錯,那麼在控制台使用cl時會出現沖突錯誤。
由于WIN10檔案中搜素檔案非常慢,且不便檢視目錄與檔案類型。建議使用Everything軟體進行檔案的查找。