vscode编辑远程linux系统下c/c++代码实现代码补全

[TOC]

本文说明

当前的使用场景是在windows上远程编辑linux开发服务器下的代码,要一个可以代码补全的编辑器而已,并不使用它来编译运行windows程序想用vscode作为IDE的,如果是开发windows程序建议直接下载vs。

本文主要介绍vscode在编写c/c++程序时候的设置方法,我结合了官方以及网上一些文章里的方法,经过自己的反复测试改进,基本已经用的比较舒服了。

最后强调下,vscode毕竟不是一个IDE,只是一个编辑器,它的代码补全还是很渣的,经成会挂掉,需要重新索引或者关掉再打开,预期不能太高。

为什么使用vscode

因为vscode基本什么语言都支持,很方便。什么shell、makfile、python、java、cmake、markdown都可以,甚至很偏门的 NVIDA的cuda、tars的.tars都有插件。毕竟虽然是写c++代码,但还是经常要写写用到其他文件格式,我可以在一个vsc里同时编辑shell、java 、c++、makefile...

为什么不使用vs?visual studio有很多不方便。

  • 没有工作区的概念
    vs2017已经可以以目录的方式打开一个项目,不需要为Linux代码也创建.sln文件,但是没有工作区的概念,一次只能打开一个目录,而使用vscode我可以把所有相关的目录都放在一个工作区。
  • visual studio创建的文件默认编码是GB2312
    这会导致注释乱码甚至其他隐晦问题,试过不少方案都没法设置为默认utf8。毕竟我们是开发linux上的代码,而linux的默认编码是utf8。
  • 最重要的是很卡
    可能是远程开发的缘故,文件IO不快,visual stido的后台解析显得很卡。

vscode的插件和配置介绍

在讲具体的配置之前,先介绍下vsc的插件和配置。

vsc的插件很强大,利用插件几乎可以开发任何语言。点击左边的工具栏安装插件。


vsc的配置分为全局的用户配置和只在工作区有效的工作区配置,工作区配置是可以覆盖用户配置,这个很好理解。依次点击File->Preferences->Settings打开配置文件。

除了本身的配置,安装了插件后,有些插件也有配置。

这些配置有些可以直接在图形界面设置,有些则需要修改json文件。

准备编译器和标准库

因为我只是把vscode作为一个编辑器,并不用来编译,只需要一个库文件用来智能补全就可以了,所以实际什么编译器都可以。一共有三种方案:微软的msvcclang+mingwwindows10的linux子系统

  • msvc的方案
    下载一个vs,勾选c++相关的就可以了。
  • windows的linux子系统,即WSL的方案
    装一个WSL,安装gcc。这种方法其实也不错,WSL的安装体积比VS要小的多,而且你还多了一个“虚拟机”可以用...
  • clang+mingw64的方案(不建议,下载很慢)
    • 首先下载clang,装好后会有一个LLVM的目录,因为clang只是一个编译器前端,只是做一些词法解析等工作,它需要LLVM作为编译器后端。
    • 装好后下载mingw64,然后下载c++库。因为clang只是一个编译器,并没有库文件。
    • 下载完毕把将mingw64文件夹里的东西全部复制到LLVM目录。对于我们来说mingw已经可以删了。这样我们就得到一个mingw的c++标准库文件了。

建议先装个vs,然后再装一个WSL,毕竟这两样迟早还是用的上的。

安装c/c++插件

直接搜索C/C++安装之。

如果是采用clang+mingw的方案,则还需要安装C/C++ Clang Command Adapter。

c/c++插件的配置介绍

原理:
插件会提供一个配置文件,里面有些编译器路径、包含目录等选项,根据自己的需要配置整个用户的还是单个工作区的。插件的intelliSense会根据配置里编译器路径寻找标准库,分别是msvc、mingw和WSL里gcc。然后根据设置的包含目录去找第三方库和项目里的代码。

主要选项:

  • C_Cpp.default.compilerPath
    编译器的路径,根据你安装的编译器配置。如果使用WSL(windows sub linux,具体自己搜索),编译器路径可以直接设置/usr/bin/g++,vscode可以自己路径处理。
  • C_Cpp.default.intelliSenseMode
    有gcc-x64 msvc-x64 clang-x64,这个是和使用的编译器对应的。
  • C_Cpp.default.includePath
    头文件包含路径,是和你代码里include头文件相关的,如果配置错误就会有波浪线的错误提示,反正我们只是编辑查看,没有强迫证可以不管。如果使用WSL,可以直接写/usr/local/include
  • C_Cpp.default.browse.path
    文件的搜索路径,如果这个路径配置不对,文件就会找不到,代码补全就不可用,也无法查看定义。所以这个选项其实是我们这种场景里最重要的选项了。注意这个目录是可以递归的,包含一个目录之后它下面的所有子目录也会被包含。同样,如果使用WSL,你可以直接写linux的路径。实际使用中发现,一旦编译器路径设置为WSL里的gcc,vsc会自动包含/usr/include下的所有文件。

注意填写windows路径的时候要使用/而不是\

工作区配置示例

如果你有一个项目要长久维护,最好做一个单独的配置文件。按ctrl+shift+p,选择c/cpp edit configurations,给工作区添加配置文件。

配置示例:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceRoot}",
                "${workspaceRoot}/src/",
                "C:/include" 
            ],
            "browse": {
                "path": [
                    "${workspaceRoot}",
                    "${workspaceRoot}/src/",
                    "C:/include"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        },
        {
            "name": "Linux",
            "compilerPath": "/usr/bin/g++",
            "intelliSenseMode": "gcc-x64",
            "includePath": [
                "${workspaceRoot}/cpp/src",
                "${workspaceRoot}/cpp/include",
                "${workspaceRoot}/cpp/3rd"
            ],
            "browse": {
                "path": [
                    "${workspaceRoot}/cpp/src",
                    "${workspaceRoot}/cpp/include",
                    "${workspaceRoot}/cpp/3rd"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        }
    ],
    "version": 4
}

多配置的切换:
我们可以根据自己的需要设置多个配置,上面我配置了两个配置---Win32和Linux。通过点击状态栏右下角的配置按钮可以进行切换。


全局配置示例

我们也可以弄一个全局的默认配置,这不是必须的,完全可以不配,我是配置了一个使用WSL的简单方案,在WSL里安装一些常用的库,临时打开一些代码文件夹后可以很方便地查看。

打开设置,找到插件设置里的c/c++模块,随便找一个选项选择在配置文件中编辑就能打开全局配置界面了。

配置示例:

{
    //gcc + WSL
    "C_Cpp.default.compilerPath": "/usr/bin/gcc",
    "C_Cpp.default.intelliSenseMode": "gcc-x64",

    //use clang
    // "C_Cpp.autocomplete": "Disabled",//使用clang的话可以使用clang的补全
    // "C_Cpp.default.intelliSenseMode": "clang-x64",
    //"C_Cpp.default.compilerPath": "C:/Program Files/LLVM/bin/g++.exe",

    //use msvc
    // "C_Cpp.default.intelliSenseMode": "msvc-x64",

    //cpp
    "C_Cpp.intelliSenseEngine": "Default",//不设置的话默认使用老引擎

    "C_Cpp.default.cStandard": "c11",
    "C_Cpp.default.cppStandard": "c++17",

    "C_Cpp.default.browse.path": [
        "${workspaceFolder}",
    ],

    "C_Cpp.default.includePath":
    [
        "${workspaceFolder}",
    ]
}

最佳实践方案

  • 安装一个visual studio使用msvc的编译器
    因为使用WSL会导致默认包含WSL里安装的库文件,导致要解析的文件太多。你可以通过主界面右下角状态栏查看当前工程要解析的文件数目。
  • 使用samba映射远端linux开发服务器的时候一定要选择“磁盘映射”,而不是“添加一个网络位置
    经实验,使用网络位置要卡的多,可能这样IO的效率更低。
  • browse.path不要包含太大的目录
    可以细化到具体几个需要的子目录,因为browse.path是递归的,包含太大的目录会导致要解析的文件太多。给自己的代码目录设置一个类似src的目录,因为自己的代码肯定要包含,如果放在最外面,包进browse.path后就会导致各种其他文件也被包含。
  • 如果工程里有第三方库的源码又有第三方库单独的include文件,那么只包含前者
    因为经常要查看第三方库里某些方法的实现以及查看例子,我一般会把第三方库的源码包含在工程里,但一般情况还会有一个inclue目录放置所有头文件,这个时候我在browse.path里只配置源码。
  • 如果之前好的现在不行了,要相信这不是你的错...
    vsc本来也就只是一个编辑器而已...按ctrl+shift+p,重置intelliSense,实在不行关闭重新打开...


其他一些使用经验

  • 使用env:XX可以调用系统环境变量
    但是因为斜杠的问题,这个用起来不是很舒服。
  • 使用WSL,可以直接写linux路径,如/usr/local/include,vsc会自动转换路径。
  • 生成文件的目录
    解析代码后会生成很大的文件,这个文件保存在C:\Users\yourusername\AppData\Roaming\Code。
  • 解析过程
    刚打开工程后,vscode会开始解析,出现饼状图标的时候表示正在解析,解析完毕这个图片就没了。所以如果开始发现代码不能智能感知,等一下,等vsc解析完毕就好了。
  • ctrl+shift+p打开命令面板,里面有各种命令
  • 编辑器预设的变量。这个可能在配置脚本的时候用到。
  • 替换终端为bash的方法
    "terminal.integrated.shell.windows": "C:\\Program Files (x86)\\Git\\bin\\bash.exe"
  • 快捷键
    • ctrl + shift + p 命令栏
    • ctrl + p 快速打开文件
    • ctrl + tab 切换文件
    • ctrl + b 切换左边工具栏
    • ctrl + j 切换底部面板
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342