美文网首页开发环境搭建
vscode编辑远程linux系统下c/c++代码实现代码补全

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

作者: 东东威武 | 来源:发表于2018-12-07 21:55 被阅读114次

    当前的使用场景

    在windows上远程编辑linux开发服务器下的代码,并不使用它来编译运行windows程序想用vscode作为IDE的,如果是开发windows程序建议直接下载vs。

    我的问题是如果不配置好,vscode在使用的时候会各种不能代码补全,也没法查看代码定义,尤其是第三方库的代码。

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

    为什么使用vscode

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

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

    vscode的插件和配置介绍

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

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

    vsc的配置分为全局的用户配置和只在工作区有效的工作区配置。依次点击File->Preferences->Settings打开配置文件。

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

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

    第一步:准备编译器和标准库

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

    • msvc的方案
      下载一个vs,勾选c++相关的就可以了。
    • windows的linux子系统,即WSL的方案
      装一个WSL,安装gcc。
    • 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。

    第三步:配置

    首先介绍下原理及相关配置选项

    • 原理:
      插件会提供一个配置文件,里面有些编译器路径、包含目录等选项,根据自己的需要配置整个用户的还是单个工作区的。插件的intelliSense会根据配置里编译器路径寻找标准库,分别是msvc、mingw和WSL里gcc。然后根据设置的包含目录去找第三方库和项目里的代码。文件当前目录是自动包含的,所以如果第三方库有源码,建议直接放在项目里,这样就不用配置了,还可以看源代码实现。

    • 主要选项:

      • C_Cpp.default.compilerPath
        编译器的路径
      • C_Cpp.default.intelliSenseMode
        有gcc-x64 msvc-x64 clang-x64几种,这个是使用编译器对应的。
      • C_Cpp.default.includePath和C_Cpp.default.browse.path
        头文件包含路径,这两个设置为一样的就可以了。
        这里compilerPath和intelliSenseMode是有对应的。
    方案 compilerPath intelliSenseMode
    msvc 不用设置 msvc-x64
    clang+mingw clang的路径 clang-x64
    WSL /usr/bin/g++ gcc-x64

    WSL的方案里编译器路径可以直接设置/usr/bin/g++,vscode可以自己处理。相应的,后面一些路径也可以直接使用Linux的路径,例如/usr/local/include。实际使用中发现,一旦编译器路径设置为WSL里的gcc,vsc会自动包含/usr/include下的所有文件。

    • includePath和browse.path的配置
      includePath和browse.path都是用来配置头文件解析的范围的,后者是给新引擎使用的,但是现在新引擎还不能完全独立工作,所以暂时保留前者。两者的功能基本一样,区别是includePath是不会递归的;browse.path是可以递归的。

    所以实际配置的时候,就把这两个路径设置为自己需要添加的库目录就可以,两个一般情况都一样。

    两种具体的方案:

    • 方案1:全局配置,全部使用WSL里的库文件
      这种方式就是把compilerPath设置为WSL里的gcc编译器,项目里不包含第三方库的源码,而是在WSL里编译安装。这样WSL里安装的第三方库头文件都可以被解析到,一劳永逸,附送linux的平台API接口。这种方案就是稍微会慢一点,文件比较多,而且不方便肯第三方库代码实现。
    {
        //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}",
        ]
    }
    
    • 方案2:工作区单独配置,使用msvc编译器,包含第三方库源代码目录到工程里
      首先给工作区添加配置文件:ctrl+shift+p,c/cpp edit configurations。
      这样vsc就自动解析工程里第三方库。个别库没有源码的,可以拷贝一份头文件出来,单独包含。这样的好处解析快,还可以看源码。这里要注意填写路径的时候要使用/而不是\
    {
        "configurations": [
            {
                "name": "Win32",
                "includePath": [
                    "${workspaceRoot}",
                    "${workspaceRoot}/src/",
                    "C:/include" 
                ],
                "browse": {
                    "path": [
                        "${workspaceRoot}",
                        "${workspaceRoot}/src/",
                        "C:/include"
                    ],
                    "limitSymbolsToIncludedHeaders": true,
                    "databaseFilename": ""
                }
            }
        ],
        "version": 4
    }
    

    建议一般情况采用方案2,大部分用到的库的头文件可以拷贝出来。个别主要的第三方库可以把代码包在项目里面,方便查看。但不管怎么搞,vsc的代码补全还是不理想的,别要求太高。

    其他一些使用经验

    • 使用env:XX可以调用系统环境变量。
    • 使用WSL,可以直接写linux路径,如/usr/local/include,vsc会自动转换路径。
    • 生成文件的目录
      解析代码后会生成很大的文件,这个文件保存在C:\Users\yourusername\AppData\Roaming\Code。
    • 解析过程
      刚打开工程后,vscode会开始解析,出现饼状图标的时候表示正在解析,解析完毕这个图片就没了。所以如果开始发现代码不能智能感知,等一下,等vsc解析完毕就好了。
    • ctrl+shift+p打开命令面板,里面有很多c/c++插件的命令。
      最常用的就是编辑配置和reset intelliSense database。
    • 编辑器预设的变量。这个可能在配置脚本的时候用到。
    • 替换终端为bash的方法
      "terminal.integrated.shell.windows": "C:\\Program Files (x86)\\Git\\bin\\bash.exe"
    • 快捷键
      • ctrl + b 切换左边工具栏
      • ctrl + tab 切换文件
      • ctrl + j 切换底部面板

    相关文章

      网友评论

        本文标题:vscode编辑远程linux系统下c/c++代码实现代码补全

        本文链接:https://www.haomeiwen.com/subject/zjaxhqtx.html