在Windows上編譯C++程序不能直接使用gcc和g++命令,一般來說如果非要使用的話可以用wsl或者M(jìn)inGW。過去的很長(zhǎng)一段時(shí)間我也確實(shí)是這么做的,但是最近在學(xué)習(xí)C++20,無奈MSVC是三大主流編譯器里面相關(guān)特性支持最完善的,只能搗鼓一下怎么使用,特此記錄。
創(chuàng)新互聯(lián)公司秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),小程序開發(fā),網(wǎng)頁(yè)設(shè)計(jì)制作,移動(dòng)網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長(zhǎng)。安裝Visual StudioMSVC可以直接通過安裝Visual Studio獲取,在該頁(yè)面選擇合適的Visual Studio版本(一般來說是選社區(qū)版,因?yàn)槭敲赓M(fèi)的)就可以下載安裝。
其中MSVC工具鏈通過選擇“使用C++的桌面開發(fā)”安裝:
安裝完之后,如果使用默認(rèn)的安裝位置,應(yīng)該在C:\Program Files (x86)\Microsoft Visual Studio\20xx\Community\VC\Tools\MSVC\xx.xx.xx\bin\Hostx64\x64\
這個(gè)路徑下面有編譯鏈包含的各個(gè)工具(比如cl.exe
)。
雖然說我們找到了編譯鏈工具的所在位置,但是如果現(xiàn)在直接調(diào)用它們進(jìn)行編譯是無法正常運(yùn)行的,這是因?yàn)镸SVC工具鏈還有很多額外的環(huán)境變量配置。這些變量當(dāng)然可以手動(dòng)配置,但是Visual Studio本身提供了一個(gè)配置腳本:C:\Program Files (x86)\Microsoft Visual Studio\20xx\Community\VC\Auxiliary\Build\vcvars64.bat
,這個(gè)bat
腳本中干的事情就是把那些雜七雜八的環(huán)境變量給設(shè)置好。
因此我只把這個(gè)腳本所在的文件夾加入了Path
環(huán)境變量,這樣一來只需在cmd
中先調(diào)用vcvars64
,就可以正常使用cl.exe
等編譯工具了:
C:\Users\xxx>where cl
INFO: Could not find files for the given pattern(s).
C:\Users\xxx>vcvars64
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.11.22
** Copyright (c) 2021 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
C:\Users\xxx>where cl
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\cl.exe
不過這個(gè)腳本比較坑,必須用cmd
命令行才能運(yùn)行,在powershell
命令行中是無效的(而且依然會(huì)有配置成功的輸出,真坑)。
其實(shí)這個(gè)時(shí)候就可以使用cl.exe
直接進(jìn)行C++源文件的編譯了,比如現(xiàn)在有一份main.cpp
:
#includeint main() {std::cout<< "hello"<< std::endl;
return 0;
}
使用命令cl.exe /EHsc /std:c++20 main.cpp
就可以編譯得到文件main.exe
,運(yùn)行后輸出hello
:
C:\Users\xxx>type main.cpp
#includeint main() {
std::cout<< "hello"<< std::endl;
return 0;
}
C:\Users\xxx>cl /EHsc /std:c++20 main.cpp
用于 x64 的 Microsoft (R) C/C++ 優(yōu)化編譯器 19.29.30147 版
版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。
main.cpp
Microsoft (R) Incremental Linker Version 14.29.30147.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
main.obj
C:\Users\xxx>.\main.exe
hello
所以說使用MSVC也不難。既然搞清楚了原理,就可以去編寫vscode的相關(guān)文件(launch.json
和tasks.json
),然后讓vscode也能一鍵使用MSVC編譯運(yùn)行源代碼。
launch.json
和tasks.json
在安裝了C++插件之后,使用vscode打開C++源文件會(huì)在右上角顯示一個(gè)小三角形,按下它就會(huì)打開編譯運(yùn)行的選擇列表:
這個(gè)列表里面有的項(xiàng)是默認(rèn)配置的(比如上圖的后面四個(gè))。一般來說這個(gè)時(shí)候是會(huì)顯示像上圖一樣的那個(gè)使用cl.exe
編譯的默認(rèn)配置項(xiàng),但是其實(shí)這個(gè)是沒法用的(需要在命令行中先調(diào)用vcvars64.bat
,然后再調(diào)用code
編輯代碼,太麻煩)。
上圖中我的vscode顯示了一個(gè)我自定義的配置(也就是第一項(xiàng)),這個(gè)其實(shí)是在項(xiàng)目根目錄的.vscode
文件夾中的launch.json
和tasks.json
中定義的:
launch.json
中有一個(gè)configurations
列表,其中的項(xiàng)就是用戶自定義的那些調(diào)試啟動(dòng)項(xiàng),先放出我最終的文件:
{"configurations": [
{"name": "C/C++: 運(yùn)行活動(dòng)文件(自定義)",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\Program Files\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{"description": "將反匯編風(fēng)格設(shè)置為 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: 生成活動(dòng)文件(自定義)"
}
],
"version": "2.0.0"
}
其中name
就是會(huì)在表項(xiàng)中顯示的名字,注意不要含有cl.exe
字樣,因?yàn)楫?dāng)前版本的vscode似乎是直接通過命名進(jìn)行檢測(cè)的,如果發(fā)現(xiàn)名字里面有cl.exe
,而你又不是先調(diào)用vcvars.bat
再調(diào)用code
的,vscode就直接不讓你運(yùn)行這個(gè)任務(wù)(我真是呃呃)。
type
值為cppdbg
,就表示這個(gè)配置項(xiàng)適用于C++源文件。后面的MIMode
,miDebuggerPath
等都是對(duì)gdb
的配置,這里我就繼續(xù)沿用了MinGW的gdb
。
program
就是要運(yùn)行的編譯后的文件名。那么要得到這個(gè)exe
文件,就要先進(jìn)行編譯。編譯的步驟定義在tasks.json
中,上面的preLaunchTask
就是在指定先運(yùn)行tasks.json
中定義的name
為C/C++: 生成活動(dòng)文件(自定義)
的預(yù)編譯任務(wù),該任務(wù)完成后再執(zhí)行launch.json
中指定的指令。
tasks.json
與launch.json
的結(jié)構(gòu)大差不差,有個(gè)tasks
列表列出各個(gè)預(yù)編譯任務(wù):
{"tasks": [
{"type": "cppbuild",
"label": "C/C++: 生成活動(dòng)文件(自定義)",
"command": "cmd",
"args": [
"/c",
"vcvars64 && cl /EHsc /std:c++20 ${file}"
],
"options": {"cwd": "${fileDirname}"
},
"problemMatcher": [ ],
"group": "build",
"detail": "編譯器生成的任務(wù)。"
}
],
"version": "2.0.0"
}
因?yàn)槲业膙scode默認(rèn)終端是powershell
,不能直接調(diào)用vcvars64.bat
,所以只能通過cmd /c
的方式開一個(gè)cmd
子進(jìn)程運(yùn)行,/c
就是表示cmd
直接運(yùn)行后面接的指令。而后面接的具體指令是vcvars64 && cl /EHsc /std:c++20 ${file}
,&&
是連接符,表示左邊的命令正常完成之后執(zhí)行右邊的命令,所以其實(shí)它干的事情就是先調(diào)用vcvars64
設(shè)置好各個(gè)環(huán)境變量,然后再調(diào)用cl
編譯vscode當(dāng)前打開的C++源文件。
完成上述操作之后,就可以直接點(diǎn)vscode右上角的三角形按鈕一鍵使用MSVC編譯運(yùn)行C++程序了(另:也可以使用快捷鍵F5)。
另外,當(dāng)前vscode的官方C++插件是默認(rèn)不開啟C++20相關(guān)特性的支持的,雖然說不影響編譯和運(yùn)行,但是寫代碼的時(shí)候一堆波浪線和智能提示還是讓人很不爽。其實(shí)只需在settings.json
中加入一項(xiàng):"C_Cpp.default.cppStandard": "c++23"
就可以開啟C++20特性的支持了。
本人編寫了一個(gè)簡(jiǎn)單的用到concept
特性的代碼,模擬實(shí)現(xiàn)了python
中的enumerate
函數(shù),都是可以正常編譯運(yùn)行的:
#include#includetemplateconcept Iterable = requires(T x) {x.begin(); x.end(); };
templateclass enumerate {int start;
T obj;
using _T_Iter = decltype(obj.begin());
class _Iter {int index;
_T_Iter iter;
public:
_Iter(int index, _T_Iter iter): index(index), iter(iter) {}
void operator ++ () {++iter, ++index; }
void operator ++ (int) {++iter, ++index; }
auto operator * () {return std::pair(index, *iter); }
bool operator == (const _Iter& i) const {return iter == i.iter; }
bool operator != (const _Iter& i) const {return iter != i.iter; }
};
public:
enumerate(T obj, int start = 0): obj(std::move(obj)), start(start) {}
auto begin() {return _Iter(start, obj.begin()); }
auto end() {return _Iter(start, obj.end()); }
};
int main() {std::vector vec = {1, 4, 8, 9};
for (auto [index, item]: enumerate(vec)) {std::cout<< "["<< index<< "] "<< item<< std::endl;
}
return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站題目:Windows系統(tǒng)中vscode+MSVC的C++配置-創(chuàng)新互聯(lián)
URL標(biāo)題:http://jinyejixie.com/article20/dpojjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、定制網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容