-
1下載完 VScode 安裝c++插件,選擇微軟提供的就行了
2 配置兩個文件
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "g++",
"type": "shell",
"args": ["-g", "client.cpp", "-std=c++11", "-pthread", "-o", "client"],
"problemMatcher": {
"owner": "cpp",
"fileLocation": ["relative", "${workspaceFolder}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
}
]
}
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/client",
"preLaunchTask": "build",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
]
}
可以看別人更仔細(xì)的
原文地址: https://blog.csdn.net/wzxlovesy/article/details/76708151
寫作原因
- 微軟的 VSCode 一直以來為人詬病的一個問題就是對于 C/C++ 工程的編譯以及調(diào)試支持度有限,配置起來比較復(fù)雜,但是 vscode-cpptools 團(tuán)隊(duì)經(jīng)過一段時間的 bug 修復(fù)之后纲缓,為我們帶來了眾多新特性
- 截止到本文作成時 (2017-8-4) 此擴(kuò)展已經(jīng)更新到 0.12.1 版本狱杰,經(jīng)過嘗試使用憔披,新版本對于 C/C++ 的支持有了很大提升柱搜,但目前中文博客很少有提到如何使用新版的 vscode-cpptools辩诞,而舊版與新版之間的區(qū)別也比較明顯课幕,所以這里記錄一個 C/C++ 工作環(huán)境配置方案以供參考
面向的問題
- 一直以來,寫一個小型的 C/C++ 代碼工程是非常令人頭疼的一件事露该,比如有一個只有幾個源文件的代碼工程需要編輯和編譯:
- 打開 IDE 進(jìn)行編輯睬棚,會有種殺雞焉用牛刀的感覺,本可以在 IDE 打開的過程中就完成修改和編譯工作
- 使用代碼編輯器配合命令行進(jìn)行編譯解幼,如果代碼有配合 Makefile抑党,那么編譯不成問題,但是調(diào)試又是一個麻煩撵摆,命令行下的調(diào)試工具沒有那么直觀底靠,學(xué)習(xí)起來也很耗費(fèi)時間
- 所以能不能做個折衷,直接在輕量級的代碼編輯器完成編輯特铝、編譯暑中、調(diào)試的工作呢?直到最近 vscode-cpptools 做了大量更新鲫剿,這個想法才得以更好地實(shí)現(xiàn)
準(zhǔn)備工作
工具準(zhǔn)備
- 安裝 VS Code: 由于我們這里記錄的是工具配置鳄逾,所以暫不介紹安裝流程,但相信點(diǎn)進(jìn)這篇博客的讀者具備安裝工具的能力灵莲,或者已經(jīng)安裝好了 VS Code
- 安裝 vscode-cpptools: 在 VS Code 的插件安裝欄中搜索 C/C++ 即可找到微軟官方出品的這個工具雕凹,根據(jù)指引安裝并重載窗口即可
- 編譯工具安裝: 一般來講在 VS Code 中進(jìn)行開發(fā)并不涉及編譯工具版本,但是由于其對 Clang 的支持比較好,我推薦有能力的讀者安裝 Clang 枚抵,當(dāng)然其他的任何編譯工具都是可以的线欲,包括 GCC,MSVC等
- 但是這里不得不提的一點(diǎn)是汽摹,在 Windows 下安裝 Clang 是一件不太愉快的事情询筏,如果您在安裝時遇到困難,大可放棄安裝 Clang 竖慧,轉(zhuǎn)而安裝 GCC
- 本文講解的內(nèi)容是在 Windows 下實(shí)現(xiàn)的,在其他系統(tǒng)當(dāng)中僅需對工具目錄等進(jìn)行簡單的修改即可復(fù)現(xiàn)這個過程
方案選擇
- 根據(jù)應(yīng)用環(huán)境不同逆屡,本文提出兩種解決 C/C++ 工作環(huán)境配置的方案:
- 第一種是完全依賴 VS Code 的解決方案圾旨,即只使用其內(nèi)置工具實(shí)現(xiàn)工作環(huán)境配置。這種方案比較簡單魏蔗,但是對于代碼的遷移和擴(kuò)展造成了一定的困擾砍的。
- 第二種是 VS Code 配合 Makefile 的解決方案,即使用 VS Code 的代碼編輯功能莺治,配合 Makefile 的編譯支持來配置工作環(huán)境廓鞠。相對第一種解決方案,這種方案更適合代碼的遷移
- 例如代碼從 Windows 平臺的 VS Code 中遷移到服務(wù)器的 Linux 命令行下時谣旁,可以在 Windows 中使用 VS Code 來編輯和編譯床佳,將代碼遷移后在 Linux 下使用 Makefile來編譯
方案一:VS Code 原生工具編譯
1. 新建測試工程
首先新建一個文件夾 VSC-CPP 并編寫幾個源文件,作為測試樣例
這個工程包含五個文件榄审,包括兩對 .cpp + .h 的函數(shù)聲明與實(shí)現(xiàn)砌们,以及一個調(diào)用這兩個函數(shù)的 main.cpp
目錄結(jié)構(gòu)
- add.h // add() 函數(shù)聲明
- add.cpp // add() 函數(shù)實(shí)現(xiàn)
- sub.h // sub() 函數(shù)聲明
- sub.cpp // sub() 函數(shù)實(shí)現(xiàn)
- main.cpp // 調(diào)用 add() 與 sub()
- add.h:
#ifndef _ADD_H_
#define _ADD_H_
int add(int a, int b);
#endif // ! _ADD_H_
- add.cpp:
#include "add.h"
int add(int a, int b) { return a + b; }
- add.cpp:
#include "add.h"
int add(int a, int b) { return a + b; }
- sub.h:
#ifndef _SUB_H_
#define _SUB_H_
int sub(int a, int b);
#endif // ! _SUB_H_
- sub.cpp:
#include "sub.h"
int sub(int a, int b) { return a - b; }
- main.cpp:
#include "add.h"
#include "sub.h"
#include <iostream>
int main() {
std::cout << add(1, 2) << std::endl;
std::cout << sub(2, 1) << std::endl;
return 0;
}
2. 配置環(huán)境
首先假定我們使用的編譯工具如下:
- 編譯工具:g++
- 調(diào)試工具:gdb
-
在 VS Code 中打開工具窗口 (默認(rèn)Ctrl+Alt+P) ,輸入 C/CPP: Edit Configurations來生成配置文件
-
然后在自動打開的c_cpp_properties.json中配置 Include路徑等內(nèi)容 (一般而言自動生成的就是可用的搁进,但是 Windows 下可能需要額外配置)
- 上一步結(jié)束后浪感,一些 C/C++ 的代碼提示等功能應(yīng)該就可以正常工作了,接下來我們讓 VS Code 能處理編譯工作
- 打開工具窗口 (默認(rèn)Ctrl+Shift+P) → \rightarrow→ 輸入Tasks: Configure Task Runner饼问,彈出窗口中選擇
- Others (這里是假定我們要用 GCC 來編譯影兽,如果使用 MSBuild 做這項(xiàng)工作,那么可以直接選擇 MSBuild 選項(xiàng)) → \rightarrow→ 在新打開的tasks.json中配置如下 注意:復(fù)制這段代碼的時候請刪除其中的注釋莱革,否則可能會報(bào)錯
*task.json:
{
"version": "2.0.0",
"tasks": [
{
// 默認(rèn)第一條為編譯命令
"taskName": "build",
// 使用 g++ 編譯
"command": "g++",
// 參數(shù)包含所有使用到的源文件
"args": [
"main.cpp",
"add.cpp",
"sub.cpp",
"-o",
"main.exe"
],
// 默認(rèn)在 shell 中執(zhí)行編譯命令
"type": "shell"
},
{
// 編譯 debug 用的目標(biāo)文件
"taskName": "build-debug",
"command": "g++",
// -g 參數(shù)用于編譯可 debug 的目標(biāo)文件
"args": [
"-g",
"main.cpp",
"add.cpp",
"sub.cpp",
"-o",
"debug.exe"
],
"type": "shell"
}
]
}
-
至此代碼應(yīng)該可以正常編譯了:打開工具窗口 (默認(rèn)Ctrl+Alt+P) → \rightarrow→ 輸入Tasks: Run Tasks → \rightarrow→ 此時應(yīng)該已經(jīng)可以看到兩個不同的任務(wù)峻堰,分別為 build 和 build-debug,與上一步定義的相同
-
選擇 build 并執(zhí)行輸出得到的目標(biāo)文件即可看到結(jié)果驮吱,說明編譯執(zhí)行是正確無誤的
-
接下來嘗試對代碼進(jìn)行調(diào)試茧妒,進(jìn)入調(diào)試窗口 → \rightarrow→ 點(diǎn)擊調(diào)試配置按鈕 (如圖中紅圈所示)
-
選擇 C++(GDB/LLDB) (如果使用 MSVC 編譯,可以選擇C++(Windows)) → \rightarrow→ 此時會生成調(diào)試配置文件 launcher.json
- 使用配置如下左冬,根據(jù)您的具體系統(tǒng)環(huán)境進(jìn)行修改
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
// g++ -g 生成的調(diào)試用目標(biāo)文件名
"program": "${workspaceRoot}/debug.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
// 輸入 gdb 的路徑 (有些情況下需要絕對路徑)
"miDebuggerPath": "gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// task.json 中指定的調(diào)試目標(biāo)文件編譯命令
// 這樣可以在調(diào)試前免去手動執(zhí)行 build-debug 的一步
"preLaunchTask": "build-debug"
}
]
}
- 在源文件中添加一個斷點(diǎn)桐筏,點(diǎn)擊調(diào)試界面中的開始調(diào)試按鈕來調(diào)試
-
至此編譯和調(diào)試工作都可以正常進(jìn)行了,如果 GDB 版本足夠高拇砰,在調(diào)試 STL 程序時也會有很好的效果
- 第一種方案的配置到這里基本結(jié)束了梅忌,大家可以繼續(xù)探索這種方案狰腌,不過這種方案比較受制于 VS Code ,可移植性不高牧氮。接下來我們提出另一種方式來提高 VS Code 的 C/C++ 工程的靈活性琼腔。
方案二:VS Code 配合 Makefile 來提高 C/C++ 工程的可移植性
準(zhǔn)備工作
- 在方案一的基礎(chǔ)上仍需準(zhǔn)備如下內(nèi)容:
- 準(zhǔn)備一套 Makefile 模板,比如說 https://github.com/TheNetAdmin/Makefile-Templates 踱葛,或者也可以自行寫一套模板丹莲,一個好的 Makefile 模板可以省去很多麻煩
- 安裝編譯工具與 make 工具:尤其是在 Windows 下,使用 make 是一個比較麻煩的事情尸诽,推薦大家使用 msys 提供的一套工具甥材,這里有一個打包供下載 https://pan.baidu.com/s/1kV5hx3p
方案說明
- 這個方案的思路是:使用 Makefile 來構(gòu)建工程, VS Code 通過 Tasks 調(diào)用 make 工具來編譯性含,再通過調(diào)用 gdb 來調(diào)試
- 其優(yōu)點(diǎn)在于不是過分依賴 VS Code 自身的配置洲赵,一個合適的 Makefile 可以在各個平臺上執(zhí)行編譯,但是在開發(fā)過程中又可以用到 VS Code 自身的插件帶來的便利商蕴,減少命令輸入叠萍,減少命令行 gdb 調(diào)試帶來的煩惱
步驟說明
- 首先構(gòu)建一個 Makefile ,如果沒有合適的可以到這里找到一些現(xiàn)成模板
# originating https://github.com/TheNetAdmin/Makefile-Templates
# tool marcros
CC := g++
CCFLAG := -std=c++14
DBGFLAG := -g
CCOBJFLAG := $(CCFLAG) -c
# path marcros
BIN_PATH := bin
OBJ_PATH := obj
SRC_PATH := src
DBG_PATH := debug
# compile marcros
TARGET_NAME := main
ifeq ($(OS),Windows_NT)
TARGET_NAME := $(addsuffix .exe,$(TARGET_NAME))
endif
TARGET := $(BIN_PATH)/$(TARGET_NAME)
TARGET_DEBUG := $(DBG_PATH)/$(TARGET_NAME)
MAIN_SRC := src/main.cpp
# src files & obj files
SRC := $(foreach x, $(SRC_PATH), $(wildcard $(addprefix $(x)/*,.c*)))
OBJ := $(addprefix $(OBJ_PATH)/, $(addsuffix .o, $(notdir $(basename $(SRC)))))
OBJ_DEBUG := $(addprefix $(DBG_PATH)/, $(addsuffix .o, $(notdir $(basename $(SRC)))))
# clean files list
DISTCLEAN_LIST := $(OBJ) \
$(OBJ_DEBUG)
CLEAN_LIST := $(TARGET) \
$(TARGET_DEBUG) \
$(DISTCLEAN_LIST)
# default rule
default: all
# non-phony targets
$(TARGET): $(OBJ)
$(CC) $(CCFLAG) -o $@ $?
$(OBJ_PATH)/%.o: $(SRC_PATH)/%.c*
$(CC) $(CCOBJFLAG) -o $@ $<
$(DBG_PATH)/%.o: $(SRC_PATH)/%.c*
$(CC) $(CCOBJFLAG) $(DBGFLAG) -o $@ $<
$(TARGET_DEBUG): $(OBJ_DEBUG)
$(CC) $(CCFLAG) $(DBGFLAG) $? -o $@
# phony rules
.PHONY: all
all: $(TARGET)
.PHONY: debug
debug: $(TARGET_DEBUG)
.PHONY: clean
clean:
@echo CLEAN $(CLEAN_LIST)
@rm -f $(CLEAN_LIST)
.PHONY: distclean
distclean:
@echo CLEAN $(CLEAN_LIST)
@rm -f $(DISTCLEAN_LIST)
- 根據(jù)這個 Makefile绪商,構(gòu)建一個目錄結(jié)構(gòu)如下的工程目錄
- Project
- Makefile
- src: 所有源文件 (不得放在子目錄)
- add.cpp
- add.h
- sub.cpp
- sub.h
- main.cpp
- obj
- 空
- debug
- 空
- bin
- 空
- 然后對于 VS Code 的 tasks.json 和 launch.json 做一些修改如下
- tasks.json
{
"version": "2.0.0",
"tasks": [
{
"taskName": "build",
"command": "make",
"args": ["default"],
"type": "shell"
},
{
"taskName": "build-debug",
"command": "make",
"args": ["debug"],
"type": "shell"
},
{
"taskName": "clean",
"command": "make",
"args": ["clean"],
"type": "shell"
}
]
}
- launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
// 修改為新的測試目標(biāo)文件路徑
"program": "${workspaceRoot}/debug/main.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build-debug"
}
]
}
-
之后就如方案一中的步驟使用編譯和調(diào)試工具即可
- 這樣的話將這個工程遷移到其他平臺也不用擔(dān)心沒有 VS Code 而無法使用
- 同時苛谷,如果工程發(fā)生重構(gòu),那么只需要更改 Makefile 與工程結(jié)構(gòu)即可部宿,不需要在 VS Code 中修改過多
總結(jié)
總體而言抄腔,經(jīng)過微軟官方團(tuán)隊(duì)一段時間的努力, VS Code 上的 C/C++ 開發(fā)體驗(yàn)有了很大提升理张,在面對一個比較小型的工程時赫蛇,我們可以免去開啟 IDE 的時間以及處理 IDE 目錄結(jié)構(gòu)的時間,從而快速打開工程雾叭,快速開發(fā)并驗(yàn)證思路
但是 VS Code 畢竟只是一個代碼編輯器悟耘,無論我們賦予它多少功能,其對大型工程的處理能力終究是不如 IDE 的织狐。比如 Refactor 暂幼,包管理,動態(tài)類型糾錯移迫,語法糾錯等功能一直是 IDE 的強(qiáng)項(xiàng)旺嬉,所以在面對比較復(fù)雜的工程時,不用多想厨埋,還是乖乖使用 IDE 吧