Windows系統(tǒng)中vscode+MSVC的C++配置-創(chuàng)新互聯(lián)

Windows系統(tǒng)中vscode+MSVC的C++配置

在Windows上編譯C++程序不能直接使用gcc和g++命令,一般來說如果非要使用的話可以用wsl或者M(jìn)inGW。過去的很長一段時(shí)間我也確實(shí)是這么做的,但是最近在學(xué)習(xí)C++20,無奈MSVC是三大主流編譯器里面相關(guān)特性支持最完善的,只能搗鼓一下怎么使用,特此記錄。

創(chuàng)新互聯(lián)公司秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),小程序開發(fā),網(wǎng)頁設(shè)計(jì)制作,移動(dòng)網(wǎng)站建設(shè)營銷型網(wǎng)站建設(shè)幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長。安裝Visual Studio

MSVC可以直接通過安裝Visual Studio獲取,在該頁面選擇合適的Visual Studio版本(一般來說是選社區(qū)版,因?yàn)槭敲赓M(fèi)的)就可以下載安裝。

其中MSVC工具鏈通過選擇“使用C++的桌面開發(fā)”安裝:

安裝截圖(來源:微軟官網(wǎng))
安裝完之后,如果使用默認(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)。

配置環(huán)境變量

雖然說我們找到了編譯鏈工具的所在位置,但是如果現(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等編譯工具了:

Path環(huán)境變量

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.jsontasks.json),然后讓vscode也能一鍵使用MSVC編譯運(yùn)行源代碼。

配置launch.jsontasks.json

在安裝了C++插件之后,使用vscode打開C++源文件會(huì)在右上角顯示一個(gè)小三角形,按下它就會(huì)打開編譯運(yùn)行的選擇列表:

小三角形

配置項(xiàng)列表

這個(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.jsontasks.json中定義的:

.vscode文件夾

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)行檢測的,如果發(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等都是對gdb的配置,這里我就繼續(xù)沿用了MinGW的gdb

program就是要運(yùn)行的編譯后的文件名。那么要得到這個(gè)exe文件,就要先進(jìn)行編譯。編譯的步驟定義在tasks.json中,上面的preLaunchTask就是在指定先運(yùn)行tasks.json中定義的nameC/C++: 生成活動(dòng)文件(自定義)的預(yù)編譯任務(wù),該任務(wù)完成后再執(zhí)行launch.json中指定的指令。

tasks.jsonlaunch.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è)簡單的用到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;
}

成功運(yùn)行

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:Windows系統(tǒng)中vscode+MSVC的C++配置-創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/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)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司