C++开发环境最佳实践

简介: C++开发环境最佳实践

没有什么比开发环境这个话题更能引起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访问的远程机器

e8feb6559045a3b98d14899be037ccde.png


然后修改本地机器上的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++插件(注意安装到远程机器)

06e09663971bf1935602bbb5517a3231.png


在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插件,同样也是按照到远程开发机上。

be12a5ee76d9060f4d8d7519d249c880.png


接着在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功能 ,如下所示

9edf7c59ba5522381569c9a1cfe12a12.png


优缺点和场景


插件 优点 缺点 场景
clangd 项目加载速度快,不超过1min;代码跳转、自动补全、格式化、重构等功能体验很好 生成compile_commands依赖cmake配置。但也可通过其他编译工具在没有cmake配置的情况下生成。 适用于大项目的代码阅读和开发。
c/c++ 不依赖cmake配置 项目较大时,代码跳转不准确,自动补全功能几乎不可用 适用于小项目的阅读和开发;勉强用于大项目的代码阅读
相关文章
|
4月前
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
98 5
|
4月前
|
IDE Java 开发工具
【C/C++】C/C++编程——C++ 开发环境搭建
【C/C++】C/C++编程——C++ 开发环境搭建
121 0
|
4月前
|
C++
C++ 编程必备:对象生命周期管理的最佳实践
在C++中,对象的生命周期是指对象存在的时间段,从对象创建到对象销毁的整个过程。正确地管理对象的生命周期是编写高效、可靠C++代码的关键之一
90 1
|
4月前
|
NoSQL Ubuntu 测试技术
GRPC C++开发环境搭建
GRPC C++开发环境搭建
148 0
|
4月前
|
消息中间件 负载均衡 监控
【ZMQ PUB模式指南】深入探究ZeroMQ的PUB-SUB模式:C++编程实践、底层原理与最佳实践
【ZMQ PUB模式指南】深入探究ZeroMQ的PUB-SUB模式:C++编程实践、底层原理与最佳实践
1373 1
|
4月前
|
NoSQL API Redis
最佳实践|如何使用c++开发redis module
本文将试着总结Tair用c++开发redis module中遇到的一些问题并沉淀为最佳实践,希望对redis module的使用者和开发者带来一些帮助(部分最佳实践也适用于c和其他语言)。
76553 0
|
4月前
|
安全 vr&ar C++
C++:编程语言的演变、应用与最佳实践
C++:编程语言的演变、应用与最佳实践
|
4月前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】深入探索 C++ STL 容器的嵌套类型:识别、运用与最佳实践
【C++ 泛型编程 进阶篇】深入探索 C++ STL 容器的嵌套类型:识别、运用与最佳实践
131 7
|
4月前
|
设计模式 安全 C++
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
【C++ const 函数 的使用】C++ 中 const 成员函数与线程安全性:原理、案例与最佳实践
270 2
|
4月前
|
程序员 开发工具 git
【程序员英语 代码提交】C++工程师的代码提交艺术:git commit 时 精确表达与最佳实践
【程序员英语 代码提交】C++工程师的代码提交艺术:git commit 时 精确表达与最佳实践
159 1