更多精彩内容,请关注微信公众号:后端技术小屋

没有什么比开发环境这个话题更能引起cpp程序员的共鸣。本人从刚毕业时候的vim + ctags,到后来的vim + ycmd,再到后来的clion + samba, 再到现在的vscode + c/c++ + clangd + remote-ssh,折腾的不亦乐乎,也走了不少弯路。本文总结现阶段个人cpp开发环境方面的最佳事件,希望能对后来人有所裨益。在世面上更牛逼的工具出现之前,未来我的cpp开发环境应该一直是vscode + c/c++ + clangd + remote-ssh。

IDE

cpp开发流派众多,有大佬vim流一把梭,有jetbrains家忠实粉丝用clion, 也有像我这样折腾不动的懒人用vscode。

IDE优点缺点
vim可定制性很强,即可当记事本用,又可精心配置达到IDE的酷炫效果安装繁琐,代码/文件导航和补全功能都得通过安装插件获得,对初学者极度不友好
clion使用体验极好收费。远程开发费劲。cpu占用率很高
vscode使用体验较好,免费插件丰富。远程开发方便,免费

作为一个不愿意氪金,也不费劲搞破解,同时又要求一定使用体验的cpp码农,vscode无疑是必选项

远程开发 vs 本地开发

本地开发是指,代码开发、编译、运行都在本地。一般为java/go等跨平台能力比较强的语言所采用。

远程开发是指,代码的开发、编译、运行都在远程服务器上,本地只作为远程服务器上的一个终端。

远程开发和本地开发各有优缺点

开发模式优点缺点
远程开发对本地配置要求不高。环境都在远程服务器上,对出差比较友好。需要额外配置,不过代价不大
本地开发因代码编译运行都在本地,对本地机器配置要求较高配置更简单

c/c++糟糕的跨平台能力和我用了N年的小破笔记本决定了远程开发成为了我的唯一选项

远程开发的配置

首先要在vscode上安装remote-ssh 这个插件可以使你的vscode登陆上任何一台能够通过ssh访问的远程机器

image-20210801164740082

然后修改本地机器上的ssh config

如果登陆远程服务器无需经过跳板机,配置如下

Host mydev
    HostName xx.xx.xx.xx
    User yourname
    Port 22
    PreferredAuthentications publickey,password,keyboard-interactive  

如果登陆远程服务器需经过跳板机,配置如下

Host jump
    HostName xx.xx.xx.xx
    User           yourname
    Port           22
    ProxyCommand   none
    PreferredAuthentications publickey,password,keyboard-interactive  
    IdentityFile   本地rsa私钥文件路径
   
   
Host mydev
    HostName       xx.xx.xx.xx
    User           youname
    Port           22
    IdentityFile   本地rsa私钥文件路径
    ProxyCommand   C:\Windows\System32\OpenSSH\ssh.exe -o ClearAllForwardings=true jump /usr/bin/nc %h %p

最后便可在vscode上登陆远程服务器上,远程服务器cpu core够多,内存够多,磁盘够大,可不比本地开发香嘛?

更多细节请参考vscode官方文档:https://code.visualstudio.com/docs/remote/ssh

c/c++ vs clangd

远程开发配置好之后,接下来我们要在c++中配置c/c++开发环境。以下介绍vscode下c/c++开发最流行的两款插件,并分析它们的优缺点和使用场景。

c/c++

首先安装c/c++插件(注意安装到远程机器)

image-20210801170212367

在vscode打开项目下,执行命令

mkdir .vscode
cd .vscode
code c_cpp_properties.json

以clickhouse工程为例,在文件c_cpp_properties.json中加入如下内容

{
    "env": {
        "myDefaultIncludePath": ["${workspaceFolder}/src"],
        "myCompilerPath": "/usr/bin/gcc"
      },

    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/src/**",
                "${workspaceFolder}/base/**",
                "${workspaceFolder}/contrib/**",
                "${workspaceFolder}/contrib/thrift/lib/cpp/src"
                "${workspaceFolder}/contrib/orc/c++/include",
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++20",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

大功告成!

clangd

首先安装clangd插件,同样也是按照到远程开发机上。

image-20210801170743264

接着在c/c++项目中生成compile_commands.json文件,clangd依赖该文件生成compilation database, 有了它之后,clangd便可提供代码跳转,自动补全、重构、格式化等功能。

如果你的c/c++项目通过cmake管理,可通过以下命令生成compile_commands.json文件

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=YES  代码路径

注意事项

  • clangd和c/c++两个插件都提供了c++ language server功能,如果在同一个vscode项目中同时启动这俩个插件,会相互冲突。所以建议只开一个
  • clangd默认开启format on save功能,会对整个文件重新格式化。如果不需要这样,可以禁止format on save功能 ,如下所示
  • image-20210801171534827

优缺点和场景

插件优点缺点场景
clangd项目加载速度快,不超过1min;代码跳转、自动补全、格式化、重构等功能体验很好生成compile_commands依赖cmake配置。但也可通过其他编译工具在没有cmake配置的情况下生成。适用于大项目的代码阅读和开发。
c/c++不依赖cmake配置项目较大时,代码跳转不准确,自动补全功能几乎不可用适用于小项目的阅读和开发;勉强用于大项目的代码阅读

参考

https://zhuanlan.zhihu.com/p/139480735

https://zhuanlan.zhihu.com/p/145430576

推荐阅读

更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
二维码