用VScode编写C++大型项目的方法步骤

目录
  • vscode远程开发配置
    • 选用vscode的原因
    • 配置流程
    • 安装C++扩展
  • ​clang-format格式化代码
    • 安装clang-format
    • 创建clang-format文件
    • vscode支持clang-format
  • 代码检查工具clang-tidy
    • clang-tidy的安装
  • cmake实现代码工程化
    • cmake实践
    • clang-tidy在cmake中的配置
    • ccache加速编译
    • ccache安装
    • 结合cmake使用

vscode远程开发配置

由于后面项目用到了epoll和splice,这些都是unix环境中才有的调用,所以我们还是需要在linux环境中开发,我选用的vscode连接linux进行远程开发

选用vscode的原因

在这里只跟clion做下比较,clion支持的full remote development,基本原理是自动同步本地目录和远端服务器目录,在写代码时,用的还是本地环境,无法识别unix特有的那些头文件。

而vscode的远程开发,是把开发者自己机器上的 VSCode 原样拷贝到作为目标机器(Remote Host)上,以服务的形式运行,而本地的 VSCode 作为客户端,两者之间通过远程通讯协议彼此协调合作,实际上的开发工作主要是在服务端完成的。

配置流程

支持ssh公钥登录远程服务器

安装remote-ssh远程插件

安装后重启可以在侧边栏看见这个

添加ssh target

点击「SSH TARGETS」旁边的「Configure」,选择编辑第一个文件(用户目录下的.ssh/config)

在文件中填上服务器连接信息如下:

​添加远程工作区

点击「RemoteServer」后面的connection按钮,会打开一个新vscode窗口,等待连接远程服务器并完成一些初始化工作后,可点击「Open Folder」添加服务器的目录。

安装C++扩展

为了方便C++开发,我们需要添加C++扩展

​clang-format格式化代码

开发一个项目时,一般是由多个程序员共同开发维护,如果每个人的编码习惯风格都不同,整个项目可能风格杂乱,可读性差,不利于项目维护。clang-format支持的代码风格有google、llvm、Chromium Mozilla、WebKit,我们项目使用google风格。

安装clang-format

ubuntu安装

直接从apt仓库安装即可

sudo apt-get install clang-format

centos安装

centos 的yum仓库中并没有clang-format的安装包,需要更新repo源:

sudo yum install centos-release-scl-rh

之后下载clang-format:

sudo yum install llvm-toolset-7-git-clang-format

由于clang-format安装的位置不在系统的PATH变量中,所以这个时候在命令行还找不到clang-format命令。我们需要更新path变量,将clang-format的执行文件夹添加到path变量中:

找到clang-format执行文件夹

sudo find / -name *clang-format*

...
/opt/rh/llvm-toolset-7/root/usr/bin/clang-format
...

编辑~/.bashrc文件,更新path变量

export PATH=$PATH:/opt/rh/llvm-toolset-7/root/usr/bin

创建clang-format文件

输入以下命令就会按照google的格式在在当前路径下生成.clang-format文件。

clang-format -style=google -dump-config > .clang-format

大家只要讨论确认clang-format的具体内容,然后在项目根目录中加入这个文件,代码的风格问题就解决了。

vscode支持clang-format

配置在vscode保存文件后自动进行格式化

在扩展商店中搜索安装clang-format插件

打开设置面板,之后在输入框输入clang-format,在「工作区」tab上找到style选项,修改为「file」,表示按照我们自己定义的.clang-format文件进行格式化

打开设置面板,在输入框中输入save,在「工作区」tab上把「format on save」选项勾选上

代码检查工具clang-tidy

clang-tidy是一个功能十分强大的代码检查工具,能帮助我们现代化代码,提高代码的可读性

clang-tidy的安装

ubuntu安装

sudo apt-get install clang-tidy

centos安装

(1)sudo yum install centos-release-scl
(2)sudo yum install llvm-toolset-7
(3)sudo yum install llvm-toolset-7-clang-analyzer llvm-toolset-7-clang-tools-extra
(4)scl enable llvm-toolset-7 'clang -v'
(5)scl enable llvm-toolset-7 'lldb -v'
(6)scl enable llvm-toolset-7 bash

clang-tidy使用

// 列出所有的check
$ clang-tidy -list-checks -checks='*'
// 找出simple.cc中所有没有用到的using declarations. 后面的`--`表示这个文件不在compilation database里面,可以直接单独编译;
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/simple.cc --

// 找出simple.cc中所有没有用到的using declarations并自动fix(删除掉)
$ clang-tidy -checks="-*,misc-unused-using-decls" -fix path/to/simple.cc --

// 找出a.c中没有用到的using declarations. 这里需要path/to/project/compile_commands.json存在
$ clang-tidy -checks="-*,misc-unused-using-decls" path/to/project/a.cc

如果在被分析的文件后面没有"--", clang-tidy会从目录下查找compliation database,这个database就是compile_commands.json文件,里面包含该项目中所有的编译单元的编译命令。 在使用之前要导出这个文件。目前已经有工具帮我们做了这项工作。

如果是cmake的项目,通过cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources命令导出;

cmake版本需要大于3.5

  • 如果是GYP项目,通过ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.json;
  • 如果是make项目,使用Bear工具;

除了通过“-checks=”来设定检查规则,还可以在项目主目录之下添加.clang-tidy文件,在里面编写项目的检查规则,这种方式更加适合对整个项目进行定制化的规则编写。.clang-tidy文件并不是必须放在主目录之下,只是通常放在主目录之下方便对整个项目进行检查。

# .clang-tidy
Checks: '-*,clang-diagnostic-*,llvm-*,misc-*,-misc-unused-parameters,-misc-non-private-member-variables-in-classes,-readability-identifier-naming'
# Note that the readability-identifier-naming check is disabled, there are too
# many violations in the codebase and they create too much noise in clang-tidy
# results.
# Naming settings are kept for documentation purposes and allowing to run the
# check if the users would override this file, e.g. via a command-line arg.
CheckOptions:
  - key:             readability-identifier-naming.ClassCase
    value:           CamelCase
  - key:             readability-identifier-naming.EnumCase
    value:           CamelCase
  - key:             readability-identifier-naming.FunctionCase
    value:           camelBack
  - key:             readability-identifier-naming.MemberCase
    value:           CamelCase
  - key:             readability-identifier-naming.ParameterCase
    value:           CamelCase
  - key:             readability-identifier-naming.UnionCase
    value:           CamelCase
  - key:             readability-identifier-naming.VariableCase
    value:           CamelCase

上面的使用方法中,一次只能分析一个文件,如何一次性分析整个项目的文件呢?clang-tidy提供了run_clang_tidy.py脚本,通过多进程的方法对整个项目文件进行分析。(具体使用方法可参考下面的cmake写法)

cmake实现代码工程化

随着项目越来越复杂,模块越来越多,我们继续手动写makefile去构建项目显然不太合适,为了方便管理、构建复杂项目,使用cmake作为构建工具是个不错的选择。cmake是一个跨平台、开源的构建工具,可以方便的产生可移植的makefile,简化手动写makefile的工作量。

使用cmake生成makefile文件并编译一个分以下流程:

  • 在根目录及每个模块目录下编写CMakeLists.txt
  • 在根目录创建一个build文件夹
  • 进入build目录,执行cmake …/ 生成整个项目的makefile
  • 执行make和make install进行编译和安装。

cmake的命令较多,详细教程可参考https://www.jb51.net/article/180467.htm

cmake实践

CProxy的代码目录结构如下

├── client
│   ├── xxx.cpp
│   ├── ...
├── lib
│   ├── xxx.cpp
│   ├── ...
├── server
│   ├── xxx.cpp
│   ├── ...

server目录是CProxy服务端目录,client目录是CProxy客户端目录,server和client分别能构建出可执行的程序;lib目录则存放一些被server和client调用的库函数。

首先,我们先在项目根目录上创建一个CMakeLists.txt

# cmake_minimum_required:指定了当前工程支持的cmake最小版本
cmake_minimum_required(VERSION 3.1)
# project:指定工程名称
project(CProxy)
# CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug、Release、RelWithDebInfo和 MinSizeRel。
# 当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile; 当变量值为Release时,则会使用CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 中的字符串作为编译选项生成 Makefile。
SET(CMAKE_BUILD_TYPE "Debug")
# 启用GDB
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
# 启用优化(1~3)
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

# 设置 c++ 编译器,这里使用clang++进行编译
set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS -g -Wall)

message(STATUS "CMAKE_CXX_FLAGS: " "${CMAKE_CXX_FLAGS}")
string(REPLACE ";" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
message(STATUS "CMAKE_CXX_FLAGS: " "${CMAKE_CXX_FLAGS}")

# include_directories:将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
# 将工程根目录添加进来后,在server和client中能通过"lib/xxx"引入lib目录下的头文件
include_directories(${PROJECT_SOURCE_DIR})
# 添加子目录,并构建该子目录。
# 会执行lib、server、client三个目录中的CMakeLists.txt
add_subdirectory(lib)
add_subdirectory(server)
add_subdirectory(client)

上面的CMakeLists.txt添加了lib、server、client三个子目录,所以需要在这三个目录中也添加CMakeLists.txt

// lib/CMakeLists.txt
set(lib
    Buffer.cpp
    EventLoopThread.cpp
    EventLoopThreadPool.cpp
    Util.cpp
    EventLoop.cpp
    Channel.cpp
    Epoll.cpp
    Msg.cpp
    CtlConn.cpp
    ProxyConn.cpp
)

# 将${lib}变量指定的源文件生成链接文件
add_library(lib ${lib})
# target_link_libraries:将目标文件与库文件进行链接
# 使用多线程需要引入pthread库,所以将pthread库链接到上一步创建的lib目标文件中
target_link_libraries(lib pthread)

// client/CMakeLists.txt
# 将client目录下的所有源文件都存储到SOURCE_DIR变量中。
aux_source_directory(./ SOURCE_DIR)
# 将${SOURCE_DIR}中的所有源文件编译成Client可执行文件
add_executable(Client ${SOURCE_DIR})
# 生成可执行文件需要链接lib库
target_link_libraries(Client lib)

// Server/CMakeLists.txt
aux_source_directory(./ SOURCE_DIR)
add_executable(Server ${SOURCE_DIR})
target_link_libraries(Server lib)

在根目录创建build目录,并执行cmake .. 生成整个项目的makefile

mkdir build
cd build
cmake ..

在build目录下执行make进行编译

make

clang-tidy在cmake中的配置

为了方便clang-tidy在项目中的使用,可以在根目录的CMakeLists.txt添加如下配置

# 用于输出clang-tidy需要用到的compile_commands.json文件
# 这一行需要放在add_subdirectory/aux_source_directory之前
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CLANG_SEARCH_PATH "/usr/local/bin" "/usr/bin" "/usr/local/opt/llvm/bin" "/usr/local/opt/llvm@8/bin" "/usr/local/Cellar/llvm/8.0.1/bin")
if (NOT DEFINED CLANG_TIDY_BIN)
    # attempt to find the binary if user did not specify
    find_program(CLANG_TIDY_BIN
            NAMES clang-tidy clang-fidy-8
            HINTS ${CLANG_SEARCH_PATH})
endif ()
if ("${CLANG_TIDY_BIN}" STREQUAL "CLANG_TIDY_BIN-NOTFOUND")
    message(WARNING "couldn't find clang-tidy.")
else ()
    message(STATUS "found clang-fidy at ${CLANG_TIDY_BIN}")
endif ()
# 添加clang-tidy命令
add_custom_target(clang-tidy COMMAND python ${CMAKE_SOURCE_DIR}/run-clang-tidy.py                              # run LLVM's clang-tidy script
-clang-tidy-binary ${CLANG_TIDY_BIN} # using our clang-tidy binary
-p ${CMAKE_BINARY_DIR}      # using cmake's generated compile commands
)

执行cmake获取到Makefile后,在build目录下执行make clang-tidy, 即可对整个项目进行代码分析。

ccache加速编译

随着项目代码量越来越多,编译花费的时间会很长,在调试代码时,我们可能只改了一行代码,每次要编译个几分钟。这个时候就轮到ccache登场了。它将在第一遍编译时多花几秒钟,但接下来就会使编译成倍(5-10倍)的提速。

ccache 的基本原理是通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了构建速度。

ccache安装

yum install ccache

结合cmake使用

在根目录的CMakeLists.txt加上下面这段代码

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

重新进行编译,会发现第一遍还是比较久,但之后的编译速度就会变的很快了。

到此这篇关于用VScode编写C++大型项目的方法步骤的文章就介绍到这了,更多相关VScode编写C++大型项目内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++的教程详解(Windows)【真正的小白版】

    写在前面的前面:这篇文章vscode和cpp插件版本有点老了,仅供大家参考,最新的和最详细的更新见我的另一篇文章: https://www.jb51.net/article/183154.htm 写在前面: 由于这学期(或者说这一年)一直在忙别的,也没什么闲心看博客了,近期发现自己的这篇文章:整理:Visual Studio Code (vscode) 配置C.C++环境/编写运行C.C++(Windows)竟然有了好多访问,也有不少童鞋问各种问题,非常感谢大家的支持,本来是自己整理的没想到有这

  • 解决 VSCode 编写 C++11 代码报红问题分析

    问题描述 今天在写 C++ 代码的时候用上 C++11 的特性,然后发现 VSCode 虽然可以编译通过,但是会在相应位置报红,如下图所示. 并且在编译的时候遇到如下警告: C1.cpp:62:14: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]         for (auto a : vec) 问题原因: VSCode 根据编译参数,无法检测 C++11 相关语法,因此出现报红和 warni

  • vscode C++开发环境配置步骤详解(教你如何用vscode编写写C++)

    用了一段时间的cb,Devc++,但一直感觉cb的高亮太差,而Devc++使用体验差(尤其是代码补全功能),换过vs2017,但是由于其太大了,卡顿十分明显,所以最终选择了vscode这款轻量级编译器.由于自己在配置c++开发环境时遇到了不少问题,因此特地写了这篇博文,希望能够帮助后来者快速实现c++环境配置. 步骤一:下载vscode 直接进入vscode官网下载即可,要注意选择与自己系统符合的版本. 官网地址:https://code.visualstudio.com/?wt.mc_id=D

  • 用VScode编写C++大型项目的方法步骤

    目录 vscode远程开发配置 选用vscode的原因 配置流程 安装C++扩展 ​clang-format格式化代码 安装clang-format 创建clang-format文件 vscode支持clang-format 代码检查工具clang-tidy clang-tidy的安装 cmake实现代码工程化 cmake实践 clang-tidy在cmake中的配置 ccache加速编译 ccache安装 结合cmake使用 vscode远程开发配置 由于后面项目用到了epoll和splice

  • 使用coffeescript编写node.js项目的方法汇总

    Node.js 基于JavaScript编写应用,JavaScript是我的主要开发语言.CoffeeScript是编译为JavaScript的编程语言.其实CoffeeScript语言因其可以一对一的翻译为JavaScript的特性,使用起来也非常灵活.将其引入项目的方式也有很多种,在此,我将使用coffeescript编写node.js项目的方法做一个汇总. 直接使用coffee指令运行纯coffeescript项目 一般提起coffeescript,自然而然地会想到他是javascript

  • VSCode搭建STM32开发环境的方法步骤

    目录 1.安装VScode 2.安装C/C++插件 3.安装Keil Assistant插件 4.用vscode打开keil工程 5.编译.下载程序 6.常用操作 官方简述 摘要: 作为一个51单片机或STM32单片机的使用者,keil一直是我们的必备的一款工具之一.但keil的一些问题也一直存在,当然也有人用其他的比如STM32CubeIDE.但是今天推荐的是VScode+Keil Assistant插件,不需要很复杂的配置各种文件和环境变量,只需要一个插件即可!可以编译代码和下载程序. 当我

  • 基于Docker镜像部署go项目的方法步骤

    依赖知识 Go交叉编译基础 Docker基础 Dockerfile自定义镜像基础 docker-compose编排文件编写基础 当然,一点也不会也可以按照这个步骤部署完成,不过可能中间如果出点小问题,会不知道怎么解决,当然你也可以留言. 我是在mac环境上开发测试的,如果你是在windows上可能有一点出入,但应该不会有啥大问题. 一.依赖环境 Docker 二.编写一个GoLang web程序 我这里就写一个最简单的hello world程序吧,监听端口是80端口. 新建一个main.go文件

  • Visual Studio Code搭建django项目的方法步骤

    之前我们使用VSCode搭建C#项目,今天写一篇关于django项目的搭建,其实以其说是搭建django框架,不如说是如何通过vscode开发django项目:django官网:https://www.djangoproject.com/ 安装django django安装命令:pip install django,参考:https://docs.djangoproject.com/en/3.0/topics/install/ 查看django的安装版本:python -m django --v

  • jenkins自动构建发布vue项目的方法步骤

    简介 Jenkins是一个开源的.提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续.自动的构建/测试软件项目.监控外部任务的运行(这个比较抽象,暂且写上,不做解释).Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行.通常与版本管理工具(SCM).构建工具结合使用.常用的版本控制工具有SVN.GIT,构建工具有Maven.Ant.Gradle. jenkins安装 1.安装JDK yum install

  • 使用docker部署dubbo项目的方法步骤

    1.首先用springboot构建一个简单的dubbo测试程序,并引入相关依赖 编写公共接口api 编写provider实现UserSvice的方法,并暴露服务 编写provider的配置文件 编写Consumer 通过调用provider的服务获取user信息并返回 consumer的配置文件 测试程序已完成 在本地启动,看看程序是否能正常调用服务 启动zookeeper 先启动provider端再启动consumer端 通过dubbo的控制台看到我们的服务已经注册成功 通过访问本地,看到我们

  • Vite搭建React项目的方法步骤

    前言 日常放鸽,火钳刘明 这是一个基于 vite 搭建的 React 的项目,开发体验非常棒. 创建一个 Vite 项目 yarn create @vitejs/app 如上图,选择了 react-ts 预设模板,如果出现下图一样的工程 yarn // 安装依赖 yarn dev // 启动开发环境 打开浏览器输入http://localhost:3000/#/,如上图所示的话.那么恭喜你,你可以正常开发 React 项目了.完结撒花 如果不行的话,直接看 vite 官网,它比我写的详细 改造工

  • Gitlab CI-CD自动化部署SpringBoot项目的方法步骤

    目录 一.概述 二.前期准备 三.总体架构图 四.环境搭建 1.环境准备(可选) 2.Gitlab安装 3.安装 Runner 4.安装应用服务器环境 五.创建 SpringBoot 项目 1.使用Gitlab Spring 模板快速创建一个 SpringBoot 项目: 2.添加环境变量(登录应用服务器密码) 六.总结 一.概述 本文主要记录如何通过Gitlab CI/CD自动部署SpringBoot项目jar包. 二.前期准备 准备三台 CentOS7服务器,分别部署以下服务: 序号 系统

  • 使用VSCode调试Electron主进程的方法步骤

    目录 搭建环境 文档 调试 渲染进程 搭建环境 本文所使用的项目是 electron-quick-start . $ git clone https://github.com/electron/electron-quick-start $ cd ./electron-quick-start $ npm install 经过以上步骤就搭建好了基本 Electron 应用开发环境.查看 package.json: {   "name": "electron-quick-start

随机推荐