在Windows上編譯C++程序不能直接使用gcc和g++命令,一般來說如果非要使用的話可以用wsl或者MinGW。過去的很長一段時間我也確實是這么做的,但是最近在學(xué)習(xí)C++20,無奈MSVC是三大主流編譯器里面相關(guān)特性支持最完善的,只能搗鼓一下怎么使用,特此記錄。
創(chuàng)新互聯(lián)公司秉承實現(xiàn)全網(wǎng)價值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),小程序開發(fā),網(wǎng)頁設(shè)計制作,移動網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對客戶都以感恩的心態(tài)奉獻自己的專業(yè)和所長。安裝Visual StudioMSVC可以直接通過安裝Visual Studio獲取,在該頁面選擇合適的Visual Studio版本(一般來說是選社區(qū)版,因為是免費的)就可以下載安裝。
其中MSVC工具鏈通過選擇“使用C++的桌面開發(fā)”安裝:
安裝完之后,如果使用默認的安裝位置,應(yīng)該在C:\Program Files (x86)\Microsoft Visual Studio\20xx\Community\VC\Tools\MSVC\xx.xx.xx\bin\Hostx64\x64\
這個路徑下面有編譯鏈包含的各個工具(比如cl.exe
)。
雖然說我們找到了編譯鏈工具的所在位置,但是如果現(xiàn)在直接調(diào)用它們進行編譯是無法正常運行的,這是因為MSVC工具鏈還有很多額外的環(huán)境變量配置。這些變量當然可以手動配置,但是Visual Studio本身提供了一個配置腳本:C:\Program Files (x86)\Microsoft Visual Studio\20xx\Community\VC\Auxiliary\Build\vcvars64.bat
,這個bat
腳本中干的事情就是把那些雜七雜八的環(huán)境變量給設(shè)置好。
因此我只把這個腳本所在的文件夾加入了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
不過這個腳本比較坑,必須用cmd
命令行才能運行,在powershell
命令行中是無效的(而且依然會有配置成功的輸出,真坑)。
其實這個時候就可以使用cl.exe
直接進行C++源文件的編譯了,比如現(xiàn)在有一份main.cpp
:
#includeint main() {std::cout<< "hello"<< std::endl;
return 0;
}
使用命令cl.exe /EHsc /std:c++20 main.cpp
就可以編譯得到文件main.exe
,運行后輸出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編譯運行源代碼。
launch.json
和tasks.json
在安裝了C++插件之后,使用vscode打開C++源文件會在右上角顯示一個小三角形,按下它就會打開編譯運行的選擇列表:
這個列表里面有的項是默認配置的(比如上圖的后面四個)。一般來說這個時候是會顯示像上圖一樣的那個使用cl.exe
編譯的默認配置項,但是其實這個是沒法用的(需要在命令行中先調(diào)用vcvars64.bat
,然后再調(diào)用code
編輯代碼,太麻煩)。
上圖中我的vscode顯示了一個我自定義的配置(也就是第一項),這個其實是在項目根目錄的.vscode
文件夾中的launch.json
和tasks.json
中定義的:
launch.json
中有一個configurations
列表,其中的項就是用戶自定義的那些調(diào)試啟動項,先放出我最終的文件:
{"configurations": [
{"name": "C/C++: 運行活動文件(自定義)",
"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++: 生成活動文件(自定義)"
}
],
"version": "2.0.0"
}
其中name
就是會在表項中顯示的名字,注意不要含有cl.exe
字樣,因為當前版本的vscode似乎是直接通過命名進行檢測的,如果發(fā)現(xiàn)名字里面有cl.exe
,而你又不是先調(diào)用vcvars.bat
再調(diào)用code
的,vscode就直接不讓你運行這個任務(wù)(我真是呃呃)。
type
值為cppdbg
,就表示這個配置項適用于C++源文件。后面的MIMode
,miDebuggerPath
等都是對gdb
的配置,這里我就繼續(xù)沿用了MinGW的gdb
。
program
就是要運行的編譯后的文件名。那么要得到這個exe
文件,就要先進行編譯。編譯的步驟定義在tasks.json
中,上面的preLaunchTask
就是在指定先運行tasks.json
中定義的name
為C/C++: 生成活動文件(自定義)
的預(yù)編譯任務(wù),該任務(wù)完成后再執(zhí)行launch.json
中指定的指令。
tasks.json
與launch.json
的結(jié)構(gòu)大差不差,有個tasks
列表列出各個預(yù)編譯任務(wù):
{"tasks": [
{"type": "cppbuild",
"label": "C/C++: 生成活動文件(自定義)",
"command": "cmd",
"args": [
"/c",
"vcvars64 && cl /EHsc /std:c++20 ${file}"
],
"options": {"cwd": "${fileDirname}"
},
"problemMatcher": [ ],
"group": "build",
"detail": "編譯器生成的任務(wù)。"
}
],
"version": "2.0.0"
}
因為我的vscode默認終端是powershell
,不能直接調(diào)用vcvars64.bat
,所以只能通過cmd /c
的方式開一個cmd
子進程運行,/c
就是表示cmd
直接運行后面接的指令。而后面接的具體指令是vcvars64 && cl /EHsc /std:c++20 ${file}
,&&
是連接符,表示左邊的命令正常完成之后執(zhí)行右邊的命令,所以其實它干的事情就是先調(diào)用vcvars64
設(shè)置好各個環(huán)境變量,然后再調(diào)用cl
編譯vscode當前打開的C++源文件。
完成上述操作之后,就可以直接點vscode右上角的三角形按鈕一鍵使用MSVC編譯運行C++程序了(另:也可以使用快捷鍵F5)。
另外,當前vscode的官方C++插件是默認不開啟C++20相關(guān)特性的支持的,雖然說不影響編譯和運行,但是寫代碼的時候一堆波浪線和智能提示還是讓人很不爽。其實只需在settings.json
中加入一項:"C_Cpp.default.cppStandard": "c++23"
就可以開啟C++20特性的支持了。
本人編寫了一個簡單的用到concept
特性的代碼,模擬實現(xiàn)了python
中的enumerate
函數(shù),都是可以正常編譯運行的:
#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海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站題目:Windows系統(tǒng)中vscode+MSVC的C++配置-創(chuàng)新互聯(lián)
URL標題:http://bm7419.com/article20/dpojjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、手機網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站、定制網(wǎng)站、標簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容