境配置到構(gòu)建自動(dòng)化)
1. 項(xiàng)目概述為什么需要從命令行使用MSVC很多剛開(kāi)始接觸C的朋友第一個(gè)接觸的開(kāi)發(fā)環(huán)境往往是Visual Studio那個(gè)龐大的IDE。點(diǎn)一下綠色的三角按鈕程序就跑起來(lái)了一切看起來(lái)都很美好。但時(shí)間久了你可能會(huì)遇到一些困惑為什么我的項(xiàng)目換一臺(tái)電腦就編譯不過(guò)這個(gè)編譯錯(cuò)誤到底是什么意思IDE背后到底做了什么如果你想深入理解C的構(gòu)建過(guò)程或者需要在自動(dòng)化腳本、持續(xù)集成CI環(huán)境中編譯代碼那么繞開(kāi)IDE直接和編譯器“對(duì)話”就成了必備技能。這次我們要聊的就是如何擺脫對(duì)Visual Studio IDE的依賴直接使用其核心——MSVC編譯器也就是我們常說(shuō)的cl.exe在Windows的命令行Command Prompt中編譯和運(yùn)行C程序。這不僅僅是“Hello World”的另一種寫(xiě)法更是你從“會(huì)用工具”到“理解工具”的關(guān)鍵一步。掌握了命令行編譯你就能清晰地看到從源代碼.cpp到可執(zhí)行文件.exe的完整鏈條理解頭文件路徑、庫(kù)鏈接、編譯選項(xiàng)這些概念未來(lái)無(wú)論是配置CMake、理解構(gòu)建錯(cuò)誤還是進(jìn)行跨平臺(tái)開(kāi)發(fā)都會(huì)從容得多。2. 環(huán)境準(zhǔn)備找到你的“開(kāi)發(fā)人員命令提示符”在Windows上直接用cl命令十有八九會(huì)報(bào)“不是內(nèi)部或外部命令”的錯(cuò)誤。這是因?yàn)镸SVC編譯器依賴一整套特定的環(huán)境變量比如INCLUDE頭文件路徑、LIB庫(kù)文件路徑和PATH工具路徑。手動(dòng)配置這些變量非常繁瑣且容易出錯(cuò)。微軟為我們提供了一個(gè)開(kāi)箱即用的解決方案“開(kāi)發(fā)人員命令提示符”。2.1 定位并啟動(dòng)正確的命令提示符根據(jù)你安裝的Visual Studio版本不同啟動(dòng)方式略有差異。核心思路是不要使用普通的cmd或PowerShell而是使用Visual Studio自帶的、已經(jīng)配置好所有環(huán)境變量的特殊命令行工具。對(duì)于Visual Studio 2017及更高版本包括VS2019 VS2022點(diǎn)擊Windows“開(kāi)始”菜單。在應(yīng)用列表中找到并展開(kāi)名為“Visual Studio”的文件夾注意這不是Visual Studio應(yīng)用程序本身。在這個(gè)文件夾里你會(huì)看到類似“Developer Command Prompt for VS 2022”的快捷方式。點(diǎn)擊它。如果系統(tǒng)提示需要管理員權(quán)限選擇“以管理員身份運(yùn)行”。對(duì)于一些涉及系統(tǒng)目錄的操作雖然不是編譯Hello World所必需管理員權(quán)限會(huì)更方便。對(duì)于Visual Studio Build Tools 或 舊版本如果你只安裝了Visual Studio Build Tools一個(gè)更輕量、只包含編譯工具鏈的安裝包或者使用的是VS2015你可能會(huì)在開(kāi)始菜單的“Visual Studio”文件夾下找到“VS2015 x86 Native Tools Command Prompt”之類的選項(xiàng)。選擇與你目標(biāo)平臺(tái)x86或x64對(duì)應(yīng)的版本即可。注意x86和x64版本的區(qū)別在于它們配置的環(huán)境變量會(huì)指向不同架構(gòu)的編譯器和庫(kù)。如果你要編譯64位程序請(qǐng)選擇帶有“x64”或“x86_x64”字樣的提示符編譯32位程序則選擇“x86”。對(duì)于入門練習(xí)兩者皆可。2.2 驗(yàn)證環(huán)境配置是否成功啟動(dòng)“開(kāi)發(fā)人員命令提示符”后你會(huì)看到一個(gè)看起來(lái)和普通cmd一樣的黑色窗口但標(biāo)題欄通常會(huì)有“Developer Command Prompt”的字樣。這是最關(guān)鍵的一步驗(yàn)證cl編譯器是否可用。在打開(kāi)的命令行窗口中直接輸入以下命令并按回車cl如果環(huán)境配置正確你應(yīng)該會(huì)看到類似下面的輸出而不是錯(cuò)誤信息Microsoft (R) C/C Optimizing Compiler Version 19.xx.xxxxx for x86/x64 Copyright (C) Microsoft Corporation. All rights reserved. usage: cl [ option... ] filename... [ /link linkoption... ]這個(gè)輸出顯示了你的MSVC編譯器版本和架構(gòu)??吹竭@個(gè)恭喜你通往命令行編譯世界的大門已經(jīng)打開(kāi)了。如果看到的是“cl 不是內(nèi)部或外部命令...”說(shuō)明你啟動(dòng)的不是正確的“開(kāi)發(fā)人員命令提示符”或者Visual Studio/Build Tools的安裝可能有問(wèn)題需要回頭檢查安裝步驟。3. 第一個(gè)命令行C程序從創(chuàng)建到運(yùn)行環(huán)境準(zhǔn)備好了我們立刻動(dòng)手體驗(yàn)最原始的“編碼 - 編譯 - 運(yùn)行”流程。這個(gè)過(guò)程能讓你最直觀地感受到一個(gè)程序是如何誕生的。3.1 創(chuàng)建項(xiàng)目目錄和源代碼首先我們需要一個(gè)干凈的地方來(lái)存放代碼。在“開(kāi)發(fā)人員命令提示符”中執(zhí)行以下命令md C:\mycpp cd C:\mycpp這里md是創(chuàng)建目錄的命令cd是切換目錄。我習(xí)慣把項(xiàng)目放在C:\根目錄下清晰明了。你也可以放在任何你喜歡的位置比如D:\projects\。接下來(lái)創(chuàng)建我們的C源文件。我們可以直接用命令行創(chuàng)建并編輯notepad hello.cpp系統(tǒng)會(huì)彈出記事本并詢問(wèn)“是否要?jiǎng)?chuàng)建新文件”選擇“是”。然后將下面這段經(jīng)典的C代碼粘貼進(jìn)去#include iostream int main() { std::cout Hello, World from MSVC Command Line! std::endl; return 0; }代碼解釋#include iostream引入標(biāo)準(zhǔn)輸入輸出流庫(kù)這樣我們才能使用cout。int main()每個(gè)C程序都必須有的主函數(shù)入口。std::cout ...使用std命名空間下的cout對(duì)象將字符串輸出到控制臺(tái)。std::endl輸出一個(gè)換行符并刷新輸出緩沖區(qū)。return 0;向操作系統(tǒng)返回0表示程序正常結(jié)束。重要的一步保存文件。在記事本中點(diǎn)擊“文件”-“保存”。這里有個(gè)新手常踩的坑確保文件擴(kuò)展名是.cpp而不是.cpp.txt。在記事本默認(rèn)保存時(shí)如果你在文件名框里只輸入了hello.cpp它有時(shí)會(huì)偷偷保存為hello.cpp.txt。最穩(wěn)妥的方法是在記事本的“另存為”對(duì)話框中將“保存類型”選為“所有文件 (.)”。在“文件名”中完整地輸入hello.cpp。確保保存路徑就是我們剛才創(chuàng)建的C:\mycpp。保存后關(guān)閉記事本。3.2 執(zhí)行編譯命令現(xiàn)在激動(dòng)人心的時(shí)刻到了。在命令行中確保當(dāng)前目錄是C:\mycpp可以用dir命令查看目錄下是否有hello.cpp文件然后輸入編譯命令cl /EHsc hello.cpp讓我們拆解這個(gè)命令cl調(diào)用Microsoft C/C編譯器。/EHsc這是一個(gè)至關(guān)重要的編譯選項(xiàng)。它告訴編譯器啟用C異常處理的標(biāo)準(zhǔn)模式/EHs并假定extern C函數(shù)從不拋出異常/c。對(duì)于現(xiàn)代C代碼尤其是使用了try/catch或標(biāo)準(zhǔn)庫(kù)STL的程序加上這個(gè)選項(xiàng)可以避免很多潛在的運(yùn)行時(shí)問(wèn)題和警告。強(qiáng)烈建議在編譯大多數(shù)C程序時(shí)都加上它。hello.cpp要編譯的源文件。按下回車后如果代碼沒(méi)有錯(cuò)誤你會(huì)看到幾行輸出Microsoft (R) C/C Optimizing Compiler Version 19.xx.xxxxx for x86 Copyright (C) Microsoft Corporation. All rights reserved. hello.cpp Microsoft (R) Incremental Linker Version 14.xx.xxxxx.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:hello.exe hello.obj這個(gè)過(guò)程實(shí)際上包含了兩個(gè)步驟編譯Compile編譯器cl.exe將hello.cpp源代碼翻譯成機(jī)器碼生成一個(gè)中間文件hello.obj目標(biāo)文件。鏈接Link鏈接器link.exe被cl自動(dòng)調(diào)用將hello.obj和必要的運(yùn)行時(shí)庫(kù)如處理cout的庫(kù)連接在一起生成最終的可執(zhí)行文件hello.exe。/out:hello.exe這行輸出指明了生成的可執(zhí)行文件名稱。如果沒(méi)有指定默認(rèn)會(huì)使用第一個(gè)源文件的名字hello.exe。3.3 運(yùn)行你的程序編譯成功后當(dāng)前目錄下應(yīng)該生成了hello.exe和hello.obj文件。運(yùn)行它非常簡(jiǎn)單直接在命令行輸入程序名不需要加.exe后綴hello你將看到輸出Hello, World from MSVC Command Line!至此你完全繞過(guò)了Visual Studio IDE獨(dú)立完成了一次C程序的編譯和運(yùn)行。這個(gè)過(guò)程雖然簡(jiǎn)單但其意義重大你知道了cl和link這兩個(gè)核心工具的存在并親自使用了它們。4. 深入理解編譯過(guò)程與常用選項(xiàng)一次成功的編譯背后編譯器做了大量工作。了解這些能幫助你在遇到問(wèn)題時(shí)進(jìn)行排查。4.1 分步編譯與鏈接剛才我們用的cl /EHsc hello.cpp是一條龍服務(wù)。我們也可以手動(dòng)拆開(kāi)這兩步這對(duì)于理解構(gòu)建過(guò)程和調(diào)試復(fù)雜問(wèn)題很有幫助。第一步僅編譯不鏈接cl /c /EHsc hello.cpp/c選項(xiàng)告訴編譯器“只編譯不要鏈接”。執(zhí)行后只會(huì)生成hello.obj文件不會(huì)生成.exe。第二步手動(dòng)鏈接link hello.obj這時(shí)鏈接器會(huì)讀取hello.obj并將其與所需的C運(yùn)行時(shí)庫(kù)鏈接生成hello.exe。你可以通過(guò)link /?查看鏈接器的眾多選項(xiàng)。分步操作在以下場(chǎng)景很有用排查鏈接錯(cuò)誤如果編譯通過(guò)但鏈接失敗可以確認(rèn)問(wèn)題出在鏈接階段可能是庫(kù)缺失或符號(hào)未定義。編譯多個(gè)文件可以分別編譯多個(gè).cpp文件為各自的.obj最后再一次性鏈接。使用第三方庫(kù)需要明確指定鏈接哪些庫(kù)文件.lib。4.2 關(guān)鍵編譯選項(xiàng)解析MSVC編譯器有上百個(gè)選項(xiàng)掌握幾個(gè)最常用的能極大提升效率。指定輸出文件名默認(rèn)輸出名是第一個(gè)源文件的名字。我們可以用/Fe選項(xiàng)來(lái)改變。cl /EHsc hello.cpp /Fe:MyApp.exe這將生成名為MyApp.exe的程序。警告級(jí)別編譯器是你的第一道質(zhì)量防線。建議至少使用/W3三級(jí)警告對(duì)于新項(xiàng)目強(qiáng)烈推薦使用/W4四級(jí)警告近乎嚴(yán)苛。cl /W4 /EHsc hello.cpp/W4會(huì)報(bào)告很多潛在問(wèn)題比如未使用的變量、類型轉(zhuǎn)換丟失等幫助你在早期發(fā)現(xiàn)代碼瑕疵。對(duì)于追求代碼質(zhì)量的團(tuán)隊(duì)甚至?xí)_(kāi)啟“將所有警告視為錯(cuò)誤”/WX選項(xiàng)。調(diào)試信息要調(diào)試程序必須生成包含調(diào)試信息的PDB文件。cl /Zi /EHsc hello.cpp/Zi會(huì)生成一個(gè)獨(dú)立的hello.pdb文件里面包含了符號(hào)和調(diào)試信息。使用Visual Studio或WinDbg等調(diào)試器打開(kāi)hello.exe時(shí)就能進(jìn)行源代碼級(jí)別的單步調(diào)試。優(yōu)化級(jí)別發(fā)布程序時(shí)我們需要優(yōu)化。/Od禁用優(yōu)化默認(rèn)編譯快適合調(diào)試。/O1最小空間優(yōu)化。/O2最大速度優(yōu)化最常用。/Ox完全優(yōu)化近似于/O2。cl /O2 /EHsc hello.cpp預(yù)處理有時(shí)候我們想看看宏展開(kāi)后的代碼或者檢查頭文件包含。cl /E /EHsc hello.cpp hello.i/E選項(xiàng)只進(jìn)行預(yù)處理將結(jié)果輸出到標(biāo)準(zhǔn)輸出。我們將其重定向到hello.i文件。打開(kāi)這個(gè)文件你會(huì)看到所有#include的內(nèi)容都被展開(kāi)了宏也被替換了代碼會(huì)變得非常長(zhǎng)。4.3 處理多個(gè)源文件真實(shí)的項(xiàng)目不可能只有一個(gè)文件。假設(shè)我們有main.cpp,helper.cpp,helper.h。helper.h:#pragma once void printMessage(const char* msg);helper.cpp:#include iostream #include helper.h void printMessage(const char* msg) { std::cout Helper says: msg std::endl; }main.cpp:#include helper.h int main() { printMessage(Hello from multiple files!); return 0; }編譯它們非常簡(jiǎn)單只需在cl命令后列出所有.cpp文件cl /EHsc main.cpp helper.cpp編譯器會(huì)分別編譯main.cpp和helper.cpp生成main.obj和helper.obj然后鏈接器將它們合并最終生成main.exe以第一個(gè)文件命名。注意頭文件.h不需要在命令行列出。#include helper.h指令會(huì)在編譯時(shí)告訴編譯器去查找這個(gè)文件。5. 常見(jiàn)問(wèn)題與實(shí)戰(zhàn)排錯(cuò)指南從IDE轉(zhuǎn)向命令行你肯定會(huì)遇到各種“攔路虎”。下面是我總結(jié)的一些典型問(wèn)題和解決方法。5.1 環(huán)境與路徑問(wèn)題問(wèn)題1‘cl’ 不是內(nèi)部或外部命令...原因沒(méi)有在“開(kāi)發(fā)人員命令提示符”中操作或者VS/Build Tools未正確安裝。解決百分之百確認(rèn)你啟動(dòng)的是“Developer Command Prompt for VS 20xx”而不是普通的cmd。如果確認(rèn)啟動(dòng)正確嘗試在開(kāi)始菜單搜索“Visual Studio Installer”運(yùn)行后點(diǎn)擊“修改”確保“使用C的桌面開(kāi)發(fā)”工作負(fù)載已被勾選安裝。對(duì)于Build Tools同樣運(yùn)行安裝器檢查C構(gòu)建工具組件。問(wèn)題2LNK1104: 無(wú)法打開(kāi)文件“xxx.lib”原因鏈接器找不到必要的庫(kù)文件??赡苁黔h(huán)境變量LIB沒(méi)有正確設(shè)置。解決這幾乎總是因?yàn)榄h(huán)境問(wèn)題。請(qǐng)務(wù)必使用“開(kāi)發(fā)人員命令提示符”??梢栽诿钚休斎雜et LIB查看LIB環(huán)境變量是否包含類似C:\Program Files (x86)\Windows Kits\10\Lib\...的路徑。如果沒(méi)有說(shuō)明環(huán)境異常。最徹底的解決方法是修復(fù)或重新安裝Visual Studio/Build Tools。5.2 編譯與語(yǔ)法錯(cuò)誤問(wèn)題3error C2065: ‘cout’: 未聲明的標(biāo)識(shí)符原因最常見(jiàn)的原因是忘記了寫(xiě)#include iostream或者寫(xiě)了但拼寫(xiě)錯(cuò)誤。另一個(gè)可能是在使用cout時(shí)忘記了前面的std::命名空間。解決檢查源代碼確保#include iostream無(wú)誤。使用cout時(shí)前面必須加std::或者在整個(gè)文件開(kāi)頭寫(xiě)using namespace std;但通常不推薦在頭文件中使用。問(wèn)題4fatal error C1083: 無(wú)法打開(kāi)包括文件: “iostream”: No such file or directory原因編譯器找不到標(biāo)準(zhǔn)庫(kù)頭文件。這同樣是環(huán)境變量INCLUDE路徑設(shè)置錯(cuò)誤導(dǎo)致的。解決同問(wèn)題2確保在正確的命令行環(huán)境中操作。在“開(kāi)發(fā)人員命令提示符”中輸入set INCLUDE應(yīng)能看到包含VC頭文件目錄的路徑。問(wèn)題5一堆warning C4996警告提示某個(gè)函數(shù)“不安全”原因MSVC認(rèn)為你使用了一些不安全的舊函數(shù)如scanf,strcpy等推薦使用更安全的版本如scanf_s,strcpy_s。解決治標(biāo)在文件開(kāi)頭添加宏定義來(lái)禁用這個(gè)特定警告#define _CRT_SECURE_NO_WARNINGS?;蛘咴诰幾g命令中添加/wd4996來(lái)禁用4996號(hào)警告。治本按照警告建議改用更安全的函數(shù)版本。這是更好的編程實(shí)踐。5.3 鏈接與運(yùn)行時(shí)問(wèn)題問(wèn)題6程序編譯鏈接成功但運(yùn)行時(shí)一閃而過(guò)看不到輸出原因控制臺(tái)程序運(yùn)行結(jié)束后窗口立即關(guān)閉。解決在命令行中運(yùn)行就像我們之前做的在“開(kāi)發(fā)人員命令提示符”里運(yùn)行.exe程序結(jié)束后命令行會(huì)保持打開(kāi)。在代碼末尾暫停在main函數(shù)return 0;之前添加system(pause);需要#include cstdlib。但這種方法依賴系統(tǒng)命令可移植性差。手動(dòng)雙擊運(yùn)行后查看在文件資源管理器中雙擊.exe運(yùn)行可以在代碼末尾return前加一句std::cin.get();等待用戶按回車鍵后再退出。問(wèn)題7生成了.exe但雙擊運(yùn)行時(shí)提示“找不到VCRUNTIME140.dll”或類似錯(cuò)誤原因你的程序動(dòng)態(tài)鏈接了VC運(yùn)行時(shí)庫(kù)但目標(biāo)電腦上沒(méi)有安裝相應(yīng)版本的“Microsoft Visual C Redistributable”。解決靜態(tài)鏈接在編譯時(shí)加入/MT發(fā)布版或/MTd調(diào)試版選項(xiàng)。這樣會(huì)把運(yùn)行時(shí)庫(kù)代碼靜態(tài)打包進(jìn)你的.exe文件會(huì)變大但可以獨(dú)立運(yùn)行。cl /MT /EHsc hello.cpp分發(fā)運(yùn)行時(shí)庫(kù)要求用戶安裝對(duì)應(yīng)版本的Visual C Redistributable包。這是微軟官方推薦用于分發(fā)軟件的方式。5.4 進(jìn)階排查技巧當(dāng)遇到復(fù)雜錯(cuò)誤時(shí)可以借助更詳細(xì)的輸出信息。顯示詳細(xì)的構(gòu)建過(guò)程使用/Bv詳細(xì)構(gòu)建選項(xiàng)。這會(huì)讓cl打印出它調(diào)用的每個(gè)具體命令和參數(shù)對(duì)于理解構(gòu)建流程和排查環(huán)境問(wèn)題非常有幫助。cl /Bv /EHsc hello.cpp查看編譯器版本和目錄使用cl /?會(huì)顯示幫助開(kāi)頭部分就是版本信息。你也可以通過(guò)環(huán)境變量%VSCMD_VER%來(lái)查看當(dāng)前開(kāi)發(fā)人員命令提示符的版本。使用dumpbin工具這個(gè)強(qiáng)大的工具可以查看.obj,.exe,.dll,.lib文件的內(nèi)部信息。比如查看一個(gè).exe依賴哪些DLLdumpbin /DEPENDENTS hello.exe或者查看.obj文件里有哪些函數(shù)符號(hào)dumpbin /SYMBOLS hello.obj6. 構(gòu)建自動(dòng)化從命令行到腳本一旦熟悉了手動(dòng)輸入cl命令你很自然地會(huì)想“能不能寫(xiě)個(gè)腳本自動(dòng)完成” 當(dāng)然可以這是邁向?qū)I(yè)開(kāi)發(fā)的重要一步。6.1 使用批處理文件 (.bat)我們可以創(chuàng)建一個(gè)簡(jiǎn)單的build.bat文件來(lái)自動(dòng)化編譯過(guò)程。echo off REM 這是一個(gè)簡(jiǎn)單的C構(gòu)建腳本 echo 正在清理舊文件... del *.obj 2nul del *.exe 2nul echo 正在編譯... cl /nologo /W4 /EHsc /Fe:MyApp.exe main.cpp helper.cpp if %errorlevel% equ 0 ( echo 編譯成功 echo 正在運(yùn)行程序... MyApp.exe ) else ( echo 編譯失敗 pause )將這個(gè)build.bat文件放在你的項(xiàng)目目錄和.cpp文件一起雙擊運(yùn)行即可。腳本解釋echo off關(guān)閉命令回顯讓輸出更干凈。del *.obj 2nul刪除舊的.obj和.exe文件。2nul是將錯(cuò)誤信息重定向到空設(shè)備避免因文件不存在而報(bào)錯(cuò)。/nologo讓cl不顯示版權(quán)和版本信息橫幅讓輸出更簡(jiǎn)潔。if %errorlevel% equ 0檢查上一條命令cl的退出代碼。如果為0表示成功則運(yùn)行程序否則表示失敗暫停并顯示錯(cuò)誤。6.2 邁向?qū)I(yè)的構(gòu)建工具CMake MSVC對(duì)于稍大一點(diǎn)的項(xiàng)目手動(dòng)管理編譯命令和文件列表會(huì)變得非常痛苦。這時(shí)就需要像CMake這樣的跨平臺(tái)構(gòu)建系統(tǒng)。CMake可以生成針對(duì)不同平臺(tái)和編譯器的構(gòu)建文件如Visual Studio的.sln或Ninja的build.ninja或者就是Makefile。一個(gè)最簡(jiǎn)單的CMakeLists.txt文件cmake_minimum_required(VERSION 3.10) project(MyHelloWorld) set(CMAKE_CXX_STANDARD 11) # 使用C11標(biāo)準(zhǔn) add_executable(MyApp main.cpp helper.cpp)然后在“開(kāi)發(fā)人員命令提示符”中進(jìn)入項(xiàng)目目錄執(zhí)行mkdir build cd build cmake .. -G NMake Makefiles nmake解釋mkdir build cd build創(chuàng)建一個(gè)獨(dú)立的build目錄并進(jìn)入這是CMake推薦的“out-of-source build”保持源碼目錄清潔。cmake .. -G NMake Makefiles告訴CMake使用當(dāng)前目錄的上一級(jí)..中的CMakeLists.txt并生成供nmake微軟的Make工具使用的構(gòu)建文件。nmake執(zhí)行構(gòu)建編譯并鏈接出MyApp.exe。CMake會(huì)自動(dòng)檢測(cè)到你在“開(kāi)發(fā)人員命令提示符”中從而使用MSVC編譯器。通過(guò)CMake你可以輕松地管理復(fù)雜的項(xiàng)目結(jié)構(gòu)、添加第三方庫(kù)依賴、設(shè)置編譯選項(xiàng)并且你的項(xiàng)目描述CMakeLists.txt是跨平臺(tái)的。這是現(xiàn)代C項(xiàng)目的事實(shí)標(biāo)準(zhǔn)。從在命令行里敲下第一個(gè)cl命令到能夠編寫(xiě)構(gòu)建腳本再到理解如何與CMake這樣的工業(yè)級(jí)工具配合使用這條路徑清晰地勾勒出了一名C開(kāi)發(fā)者從入門到熟練的成長(zhǎng)軌跡。命令行編譯看似原始但它賦予了你對(duì)構(gòu)建過(guò)程最直接、最徹底的控制權(quán)。當(dāng)你下次再在IDE中遇到令人費(fèi)解的構(gòu)建錯(cuò)誤時(shí)不妨試著在“開(kāi)發(fā)人員命令提示符”中重現(xiàn)一下那份清晰的錯(cuò)誤輸出和完全掌控的感覺(jué)往往會(huì)讓你更快地找到問(wèn)題的根源。