没有什么比开发环境这个话题更能引起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访问的远程机器
然后修改本地机器上的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++插件(注意安装到远程机器)
在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插件,同样也是按照到远程开发机上。
接着在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功能 ,如下所示
优缺点和场景
插件 | 优点 | 缺点 | 场景 |
clangd | 项目加载速度快,不超过1min;代码跳转、自动补全、格式化、重构等功能体验很好 | 生成compile_commands依赖cmake配置。但也可通过其他编译工具在没有cmake配置的情况下生成。 | 适用于大项目的代码阅读和开发。 |
c/c++ | 不依赖cmake配置 | 项目较大时,代码跳转不准确,自动补全功能几乎不可用 | 适用于小项目的阅读和开发;勉强用于大项目的代码阅读 |