使用VSCode編譯、運行C/C++源文件


准備工作

  1.安裝MinGW64並配置環境變量,如C:\Program Files\mingw64\bin。

  2.在VSCode中選擇並安裝C/C++ Extension Pack插件。

  3.在鍵盤快捷方式中將任務: 運行測試任務鍵綁定為F4

配置json文件

  1.在合適位置創建一個存放源文件和程序的文件夾。

  2.在文件夾內創建一個名為.vscode的文件夾和一個名為bin的文件夾(用於存放生成的exe文件)。

  3.在.vscode文件夾內創建三個json文件,分別是launch.json, tasks.json, settings.json。在三個文件中輸入以下內容:

launch.json

{
    "version": "0.2.0",
    "configurations": [{
        "name": "(gdb)Launch", // 配置名稱,將會在啟動配置的下拉菜單中顯示
        "type": "cppdbg", // 配置類型,對於C/C++可認為此處只能是cppdbg,由cpptools提供;不同編程語言不同
        "request": "launch", // 可以為launch(啟動)或attach(附加)
        "program": "${fileDirname}/bin/${fileBasenameNoExtension}.exe", // 將要進行調試的程序的路徑
        "args": [], // 程序調試時傳遞給程序的命令行參數,一般設為空
        "stopAtEntry": false, // 設為true時程序將暫停在程序入口處,相當於在main上打斷點
        "cwd": "${workspaceFolder}", // 調試程序時的工作目錄,此為工作區文件夾;改成${fileDirname}可變為文件所在目錄
        "environment": [], // 環境變量
        "externalConsole": false, // 使用單獨的cmd窗口,與其它IDE一致;為false時使用內置終端
        "internalConsoleOptions": "neverOpen", // 如果不設為neverOpen,調試時會跳到“調試控制台”選項卡,你應該不需要對gdb手動輸命令吧?
        "MIMode": "gdb", // 指定連接的調試器,可以為gdb或lldb。但我沒試過lldb
        "miDebuggerPath": "gdb.exe", // 調試器路徑,Windows下后綴不能省略,Linux下則不要
        "setupCommands": [
            { // 模板自帶,好像可以更好地顯示STL容器的內容,具體作用自行Google
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": false
            }
        ],
        "preLaunchTask": "build" // 調試前執行的任務,一般為編譯程序。與tasks.json的label相對應
    }]
}

tasks.json

{
    "version": "2.0.0",
    "tasks": [
        { // 這個大括號里是‘構建(build)’任務
            "label": "build", // 任務名稱,與launch.json的preLaunchTask相對應
            "command": "gcc", // 要使用的編譯器,C++用g++
            "args": [
                "${file}", // 指定要編譯的是當前文件
                "-o", // 指定輸出文件名,不加該參數則默認輸出a.exe,Linux下默認a.out
                "${fileDirname}/bin/${fileBasenameNoExtension}.exe",
                "-g", // 生成和調試有關的信息
                "-m64", // 不知為何有時會生成16位程序而無法運行,此條可強制生成64位的
                "-Wall", // 開啟額外警告
                "-static-libgcc", // 靜態鏈接libgcc,一般都會加上
                "-fexec-charset=GBK", // 生成的程序使用GBK編碼,不加這條會導致Win下輸出中文亂碼;繁體系統改成BIG5
                "-std=c11", // 語言標准,可根據自己的需要進行修改,寫c++要換成c++的語言標准,比如c++11
                "-D__USE_MINGW_ANSI_STDIO" // 用MinGW寫C時留着,否則不需要,用於支持printf的%zd和%Lf等
            ], // 編譯的命令,其實相當於VSC幫你在終端中輸了這些東西
            "type": "process", // process是把預定義變量和轉義解析后直接全部傳給command;shell相當於先打開shell再輸入命令,所以args還會經過shell再解析一遍
            "group": { // 表示‘組’,我們可以有很多的task,然后把他們放在一個‘組’里
                "kind": "build",
                "isDefault": true // 不為true時ctrl shift B就要手動選擇了
            },
            "presentation": {
                "echo": true, // 表示在執行任務時在終端要有輸出
                "reveal": "always", // 執行任務時是否跳轉到終端面板,可以為always,silent,never。具體參見VSC的文檔,即使設為never,手動點進去還是可以看到
                "focus": false, // 設為true后可以使執行task時焦點聚集在終端,但對編譯C/C++來說,設為true沒有意義
                "panel": "shared" // 不同的文件的編譯信息共享一個終端面板
            },
            "problemMatcher": "$gcc" // 捕捉編譯時終端里的報錯信息到問題面板中,修改代碼后需要重新編譯才會再次觸發
            // 本來有Lint,再開problemMatcher就有雙重報錯,但MinGW的Lint效果實在太差了;用Clangd可以注釋掉
        },
        { // 這個大括號里是‘運行(run)’任務,一些設置與上面的構建任務性質相同
            "label": "run", 
            "type": "shell", 
            "dependsOn": "build", // 任務依賴,因為要運行必須先構建,所以執行這個任務前必須先執行build任務,
            "command": "${fileDirname}/bin/${fileBasenameNoExtension}.exe", // 執行exe文件,只需要指定這個exe文件在哪里就好
            "group": {
                "kind": "test", // 這一組是‘測試’組,將run任務放在test組里方便我們用快捷鍵執行
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": true, // 這個就設置為true了,運行任務后將焦點聚集到終端,方便進行輸入
                "panel": "shared"
            }
        }
    ]
}

settings.json

{
    "files.defaultLanguage": "c", // ctrl+N新建文件后默認的語言
    "editor.formatOnType": true,  // 輸入分號(C/C++的語句結束標識)后自動格式化當前這一行的代碼
    "editor.suggest.snippetsPreventQuickSuggestions": false, // clangd的snippets有很多的跳轉點,不用這個就必須手動觸發Intellisense了
    "editor.acceptSuggestionOnEnter": "off", // 我個人的習慣,按回車時一定是真正的換行,只有tab才會接受Intellisense
    // "editor.snippetSuggestions": "top", // (可選)snippets顯示在補全列表頂端,默認是inline

    "code-runner.runInTerminal": true, // 設置成false會在“輸出”中輸出,無法輸入
    "code-runner.executorMap": {
        "c": "gcc '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -lm -static-libgcc -fexec-charset=GBK -D__USE_MINGW_ANSI_STDIO && &'./$fileNameWithoutExt.exe'",
        "cpp": "g++ '$fileName' -o '$fileNameWithoutExt.exe' -Wall -O2 -m64 -static-libgcc -fexec-charset=GBK && &'./$fileNameWithoutExt.exe'"
        // "c": "gcc $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -lm -static-libgcc -fexec-charset=GBK -D__USE_MINGW_ANSI_STDIO && $dir$fileNameWithoutExt.exe",
        // "cpp": "g++ $fileName -o $fileNameWithoutExt.exe -Wall -O2 -m64 -static-libgcc -fexec-charset=GBK && $dir$fileNameWithoutExt.exe"
    }, // 右鍵run code時運行的命令;未注釋的僅適用於PowerShell(Win10默認)和pwsh,文件名中有空格也可以編譯運行;注釋掉的適用於cmd(win7默認)、PS和bash,但文件名中有空格時無法運行
    "code-runner.saveFileBeforeRun": true, // run code前保存
    "code-runner.preserveFocus": true,     // 若為false,run code后光標會聚焦到終端上。如果需要頻繁輸入數據可設為false
    "code-runner.clearPreviousOutput": false, // 每次run code前清空屬於code runner的終端消息,默認false
    "code-runner.ignoreSelection": true,   // 默認為false,效果是鼠標選中一塊代碼后可以單獨執行,但C是編譯型語言,不適合這樣用
    "code-runner.fileDirectoryAsCwd": true, // 將code runner終端的工作目錄切換到文件目錄再運行,對依賴cwd的程序產生影響;如果為false,executorMap要加cd $dir

    "C_Cpp.clang_format_sortIncludes": true // 格式化時調整include的順序(按字母排序)
}

調試運行

  1.編寫完成后按F4進入Release模式。

  2.按F5進入Debug模式。

多個源文件的編譯

  1.安裝Code Runner插件。

  2.在設置中搜索code runner,選擇 Executor Map 在 settings.json 中編輯。

    3.修改其中的gcc $filename為gcc *.c;g++同理。

   4.點擊Run Code可直接編譯運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM