在 Windows 平台開發 C 語言 IDE 時,編譯器選擇至關重要。作者經調研發現 MinGW (Minimalist GNU for Windows) 是理想選擇:它將 GCC、G++、GDB 完整移植到 Win32,提供了與 Linux 一致的編譯體驗,無需配置複雜的 MSVC 環境。
Linux 下常用 autoconf/automake 自動生成 Makefile,但在 Windows 上缺乏成熟移植版。考慮到目標用戶為初學者,作者採用簡化策略:
.c 文件編譯為 .o 目標文件debug 目錄進行鏈接| 函數 | 優點 | 缺點 |
|---|---|---|
| system() | 簡單直接 | 會彈出 DOS 窗口,體驗差 |
| WinExec() | 可隱藏窗口 (SW_HIDE) | 不支持重定向、管道等操作符 |
| ShellExecute() | 功能強大、可隱藏窗口 | 同樣不支持操作符;非阻塞執行 |
直接調用 GCC 或帶參數的命令會導致編譯與鏈接並發執行,產生錯誤。作者嘗試過輪詢文件存在性,但無法區分「編譯中」與「編譯失敗」。最終採用 進程等待機制 實現真正的阻塞調用:
void block_ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile,
LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd)
{
SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SEE_MASK_NOCLOSEPROCESS; // 關鍵:獲取進程句柄
si.hwnd = hwnd;
si.lpVerb = _T(lpOperation);
si.lpFile = _T(lpFile);
si.lpParameters = _T(lpParameters);
si.lpDirectory = _T(lpDirectory);
si.nShow = nShowCmd;
ShellExecuteEx(&si);
DWORD dwExitCode;
GetExitCodeProcess(si.hProcess, &dwExitCode);
while (dwExitCode == STILL_ACTIVE) {
Sleep(5);
GetExitCodeProcess(si.hProcess, &dwExitCode);
}
CloseHandle(si.hProcess);
}
// 構建編譯命令:gcc 選項 目標文件 源文件 2>> 錯誤日誌
Build_cmd = gcc + option + BUILD_OBJ + File_str + " 2>>" + dir + "\\stderr";
// 調用 cmd /c 執行,支援重定向
block_ShellExecute(NULL, "open", "cmd", "/c " + Build_cmd, project_dir, SW_HIDE);
GetExitCodeProcess 輪詢 STILL_ACTIVE 實現阻塞等待cmd /c 可完整支持重定向、管道等 Shell 操作符SW_HIDE 參數確保編譯過程無視窗干擾