1.Win10+VsCode的C/CPP編譯環境搭建

我是從開始學C++的時候就一直用的是visual studio,畢竟宇宙第一IDE,寫和調試都是超級方便快捷,唯一的缺點可能就是啓動慢一點。 之前電腦沒有換固態之前,用過一段時間的codeblocks,換了之後就一直用VS了。 這次換vscode的原因主要是因爲最近看到CPP的一些細節的東西的時候發現VS會完全忽略掉這些錯誤和警告。 印象最深的是關於函數返回局部指針變量的處理: eg:

char * fun()
{
    char *p = "hello";
    return p;
}

這個函數輸入到VS裏面是完全沒有警告和錯誤的,在主函數裏調用也會輸出hello。 但是實際上CPP是不建議把字符串常量賦值給非常量字符指針的(C語言中不會報錯)。同樣的代碼在VScode選擇clang編譯就會出現警告。 還有:return p;這個是有內存風險的,局部指針創建的對象在棧上,返回p的時候函數調用完畢,指針被賦值給其他全局變量的話,棧上空間就會被釋放掉,所以這個也是有警告的。 不過上面這兩個東西放在VS裏面都是可以通過的。 所以啊,裝了個VScode來寫一些簡單的CPP項目,以避免類似的一些簡單的不好的編程習慣,而且後面的工作的話估計也不會是在VS下開發的,提前熟悉一下。 廢話少說,參考的是:VSCODE配置C/C++編譯調試環境。有一些小坑,嘗試之後最直接簡單的方法如下:

1. 下載VS Code並安裝。

地址:https://code.visualstudio.com/

VS Code是一個輕量級開源的跨平臺代碼編輯器,可以運行在win,Mac OS以及Linux系統上,爲各種常見語言(C/Cpp,Java,C#,Python,Go等)提供豐富的擴展生態系統的運行平臺。 win下安裝沒什麼說的,一步一步安裝就可以了。

2.安裝LLVM以及MinGW

  • LLVM LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time),對開發者保持開放,併兼容已有腳本。 地址:http://releases.llvm.org/download.html

然後安裝,也比較簡單,選擇一個安裝路徑就好了,然後會提示是否選擇添加環境變量,選擇Add LLVM to the system PATH for all users.

  • MinGw 地址1:https://sourceforge.net/projects/mingw-w64/ 地址2:鏈接:https://pan.baidu.com/s/1NEadtRs2SUIuJaeJ8hpAsQ 提取碼:2l9h 地址1下載來的安裝程序安裝時需要下載組件,可能出現問題,我是校園網所以沒下載下來,如果可以下載的話可以使用這種方式。 地址2中是安裝好的一個免安裝的壓縮包,只需要解壓到對應位置即可。
  • 添加環境變量。 法1. 把min GW的bin文件夾的路徑添加到環境變量之中。 重啓之後,Win+r輸入cmd打開命令行,分別輸入gcc和clang後回車。

出現如上所示的提示認爲安裝成功。 法2. 可以把MinGW中的所有文件拷貝到安裝的LLVM路徑下,兩者會無縫合並,如圖:

然後和上面說的一樣,檢測是否安裝成功。

3.安裝VS Code擴展。

  • C/C++
  • C/C++ Clang Command Adapter:提供靜態檢測(Lint),很重要.
  • Code Runner:右鍵即可編譯運行單文件,很方便

4. 配置4個.json文件。

這個配置文件我基本上都是按照知乎上面的下來的,只有很少的地方需要修改。

  • 建立工作區。 這一步在文件管理器中建立就可以了。
  • 建立.vscode配置文件夾。 在VS Code的文件管理器中找到新建文件夾的按鍵。
  • 建立配置文件。 一共四個文件,在.vscode文件夾下建立四個文件,主需要單擊新建文件的按鈕就可以了。 launch.json,tasks.json,settings.json,c_cpp_properties.json 配置分別如下: launch.json
// https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch", // 配置名稱,將會在啓動配置的下拉菜單中顯示
            "type": "cppdbg", // 配置類型,這裏只能爲cppdbg
            "request": "launch", // 請求配置類型,可以爲launch(啓動)或attach(附加)
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 將要進行調試的程序的路徑
            "args": [], // 程序調試時傳遞給程序的命令行參數,一般設爲空即可
            "stopAtEntry": false, // 設爲true時程序將暫停在程序入口處,我一般設置爲true
            "cwd": "${workspaceFolder}", // 調試程序時的工作目錄
            "environment": [], // (環境變量?)
            "externalConsole": true, // 調試時是否顯示控制檯窗口,一般設置爲true顯示控制檯
            "internalConsoleOptions": "neverOpen", // 如果不設爲neverOpen,調試時會跳到“調試控制檯”選項卡,你應該不需要對gdb手動輸命令吧?
            "MIMode": "gdb", // 指定連接的調試器,可以爲gdb或lldb。但目前lldb在windows下沒有預編譯好的版本。
            "miDebuggerPath": "gdb.exe", // 調試器路徑,Windows下後綴不能省略,Linux下則去掉
            "setupCommands": [ // 用處未知,模板如此
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": false
                }
            ],
            "preLaunchTask": "Compile" // 調試會話開始前執行的任務,一般爲編譯程序。與tasks.json的label相對應
        }
    ]
}

tasks.json

// https://code.visualstudio.com/docs/editor/tasks
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Compile", // 任務名稱,與launch.json的preLaunchTask相對應
            "command": "clang++", // 要使用的編譯器
            "args": [
                "${file}",
                "-o", // 指定輸出文件名,不加該參數則默認輸出a.exe,Linux下默認a.out
                "${fileDirname}/${fileBasenameNoExtension}.exe",
                "-g", // 生成和調試有關的信息
                "-Wall", // 開啓額外警告
                "-static-libgcc", // 靜態鏈接
                "-fcolor-diagnostics", // 彩色的錯誤信息?但貌似clang默認開啓而gcc不接受此參數
                "--target=x86_64-w64-mingw", // clang的默認target爲msvc,不加這一條就會找不到頭文件;Linux下去掉這一條
                "-std=c++17" // C語言最新標準爲c11,或根據自己的需要進行修改
            ], // 編譯命令參數
            "type": "shell", // 可以爲shell或process,前者相當於先打開shell再輸入命令,後者是直接運行命令
            "group": {
                "kind": "build",
                "isDefault": true // 設爲false可做到一個tasks.json配置多個編譯指令,需要自己修改本文件,我這裏不多提
            },
            "presentation": {
                "echo": true,
                "reveal": "always", // 在“終端”中顯示編譯信息的策略,可以爲always,silent,never。具體參見VSC的文檔
                "focus": false, // 設爲true後可以使執行task時焦點聚集在終端,但對編譯c和c++來說,設爲true沒有意義
                "panel": "shared" // 不同的文件的編譯信息共享一個終端面板
            }
            // "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的註釋符,並在上一條之後加個逗號。照着我的教程做的不需要改(也可以把這行刪去)
        }
    ]
}

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "MinGW",
            "intelliSenseMode": "clang-x64",
            "compilerPath": "C:/Program Files/LLVM/bin/gcc.exe",
            "includePath": [
                "${workspaceFolder}"
            ],
            "defines": [],
            "browse": {
                "path": [
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            },
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

settings.json

{
    "files.defaultLanguage": "cpp", // ctrl+N新建文件後默認的語言
    "editor.formatOnType": true, // 輸入時就進行格式化,默認觸發字符較少,分號可以觸發
    "editor.snippetSuggestions": "top", // snippets代碼優先顯示補全

    "code-runner.runInTerminal": true, // 設置成false會在“輸出”中輸出,無法輸入
    "code-runner.executorMap": {
        "c": "cd $dir && clang $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c11 && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -fcolor-diagnostics --target=x86_64-w64-mingw -std=c++17 && $dir$fileNameWithoutExt"
    }, // 設置code runner的命令行
    "code-runner.saveFileBeforeRun": true, // run code前保存
    "code-runner.preserveFocus": true, // 若爲false,run code後光標會聚焦到終端上。如果需要頻繁輸入數據可設爲false
    "code-runner.clearPreviousOutput": false, // 每次run code前清空屬於code runner的終端消息

    "C_Cpp.clang_format_sortIncludes": true, // 格式化時調整include的順序(按字母排序)
    "C_Cpp.intelliSenseEngine": "Default", // 可以爲Default或Tag Parser,後者較老,功能較簡單。具體差別參考cpptools擴展文檔
    "C_Cpp.errorSquiggles": "Disabled", // 因爲有clang的lint,所以關掉
    "C_Cpp.autocomplete": "Disabled", // 因爲有clang的補全,所以關掉

    "clang.cflags": [ // 控制c語言靜態檢測的參數
        "--target=x86_64-w64-mingw",
        "-std=c11",
        "-Wall"
    ],
    "clang.cxxflags": [ // 控制c++靜態檢測時的參數
        "--target=x86_64-w64-mingw",
        "-std=c++17",
        "-Wall"
    ],
    "clang.completion.enable":true // 效果效果比cpptools要好
}

settings這個文件在建立之後就會出現許多關於setting的解釋和如何賦值,可以根據自己的情況來設置:

至此就配置結束了,可以重啓一下機器(我沒有重啓也是可以的)。

5.測試。

邏輯是這樣的:

工作區下面是配置文件,以及其他的工程文件,每個工程最好都新建一個文件夾,然後在文件夾下面新建cpph文件進行程序編寫:

比如這裏編寫了一個簡單的helloworld程序,在編輯區右鍵run code就可以了。調試的話選擇debug自己設置斷點都很方便。

至此大功告成!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章