" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用VScode編寫C++大型項目的方法步驟

 更新時間:2022年05月29日 09:21:48   作者:編程小魚六六六  
本文主要介紹了用VScode編寫C++大型項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

vscode遠程開發(fā)配置

由于后面項目用到了epoll和splice,這些都是unix環(huán)境中才有的調用,所以我們還是需要在linux環(huán)境中開發(fā),我選用的vscode連接linux進行遠程開發(fā)

選用vscode的原因

在這里只跟clion做下比較,clion支持的full remote development,基本原理是自動同步本地目錄和遠端服務器目錄,在寫代碼時,用的還是本地環(huán)境,無法識別unix特有的那些頭文件。

而vscode的遠程開發(fā),是把開發(fā)者自己機器上的 VSCode 原樣拷貝到作為目標機器(Remote Host)上,以服務的形式運行,而本地的 VSCode 作為客戶端,兩者之間通過遠程通訊協(xié)議彼此協(xié)調合作,實際上的開發(fā)工作主要是在服務端完成的。

配置流程

支持ssh公鑰登錄遠程服務器

安裝remote-ssh遠程插件

安裝后重啟可以在側邊欄看見這個

添加ssh target

點擊「SSH TARGETS」旁邊的「Configure」,選擇編輯第一個文件(用戶目錄下的.ssh/config)

 在文件中填上服務器連接信息如下:

?添加遠程工作區(qū)

點擊「RemoteServer」后面的connection按鈕,會打開一個新vscode窗口,等待連接遠程服務器并完成一些初始化工作后,可點擊「Open Folder」添加服務器的目錄。

安裝C++擴展

為了方便C++開發(fā),我們需要添加C++擴展

?clang-format格式化代碼

開發(fā)一個項目時,一般是由多個程序員共同開發(fā)維護,如果每個人的編碼習慣風格都不同,整個項目可能風格雜亂,可讀性差,不利于項目維護。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安裝的位置不在系統(tǒng)的PATH變量中,所以這個時候在命令行還找不到clang-format命令。我們需要更新path變量,將clang-format的執(zhí)行文件夾添加到path變量中:

找到clang-format執(zhí)行文件夾

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

創(chuàng)建clang-format文件

輸入以下命令就會按照google的格式在在當前路徑下生成.clang-format文件。

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

大家只要討論確認clang-format的具體內容,然后在項目根目錄中加入這個文件,代碼的風格問題就解決了。

vscode支持clang-format

配置在vscode保存文件后自動進行格式化

在擴展商店中搜索安裝clang-format插件

 打開設置面板,之后在輸入框輸入clang-format,在「工作區(qū)」tab上找到style選項,修改為「file」,表示按照我們自己定義的.clang-format文件進行格式化

 打開設置面板,在輸入框中輸入save,在「工作區(qū)」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=”來設定檢查規(guī)則,還可以在項目主目錄之下添加.clang-tidy文件,在里面編寫項目的檢查規(guī)則,這種方式更加適合對整個項目進行定制化的規(guī)則編寫。.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實現代碼工程化

隨著項目越來越復雜,模塊越來越多,我們繼續(xù)手動寫makefile去構建項目顯然不太合適,為了方便管理、構建復雜項目,使用cmake作為構建工具是個不錯的選擇。cmake是一個跨平臺、開源的構建工具,可以方便的產生可移植的makefile,簡化手動寫makefile的工作量。

使用cmake生成makefile文件并編譯一個分以下流程:

  • 在根目錄及每個模塊目錄下編寫CMakeLists.txt
  • 在根目錄創(chuàng)建一個build文件夾
  • 進入build目錄,執(zhí)行cmake …/ 生成整個項目的makefile
  • 執(zhí)行make和make install進行編譯和安裝。

cmake的命令較多,詳細教程可參考http://www.dbjr.com.cn/article/180467.htm

cmake實踐

CProxy的代碼目錄結構如下

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

server目錄是CProxy服務端目錄,client目錄是CProxy客戶端目錄,server和client分別能構建出可執(zhí)行的程序;lib目錄則存放一些被server和client調用的庫函數。

首先,我們先在項目根目錄上創(chuàng)建一個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")
# 啟用優(yōu)化(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})
# 添加子目錄,并構建該子目錄。
# 會執(zhí)行l(wèi)ib、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庫鏈接到上一步創(chuàng)建的lib目標文件中
target_link_libraries(lib pthread)
 
// client/CMakeLists.txt
# 將client目錄下的所有源文件都存儲到SOURCE_DIR變量中。 
aux_source_directory(./ SOURCE_DIR)
# 將${SOURCE_DIR}中的所有源文件編譯成Client可執(zhí)行文件
add_executable(Client ${SOURCE_DIR})
# 生成可執(zhí)行文件需要鏈接lib庫
target_link_libraries(Client lib)
 
// Server/CMakeLists.txt
aux_source_directory(./ SOURCE_DIR)
add_executable(Server ${SOURCE_DIR})
target_link_libraries(Server lib)

在根目錄創(chuàng)建build目錄,并執(zhí)行cmake .. 生成整個項目的makefile

mkdir build
cd build
cmake ..

在build目錄下執(zhí)行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
)

執(zhí)行cmake獲取到Makefile后,在build目錄下執(zhí)行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)

重新進行編譯,會發(fā)現第一遍還是比較久,但之后的編譯速度就會變的很快了。

到此這篇關于用VScode編寫C++大型項目的方法步驟的文章就介紹到這了,更多相關VScode編寫C++大型項目內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++并查集算法簡單詳解

    C++并查集算法簡單詳解

    大家好,本篇文章主要講的是C++并查集算法簡單詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C語言通過三種方法實現屬于你的通訊錄

    C語言通過三種方法實現屬于你的通訊錄

    本文將實現一個通訊錄,來實現人員的增刪插改功能。文中通過三種形式來實現用戶的增刪插改,其實也就是一點點的優(yōu)化版本,從靜態(tài)的實現,到動態(tài)的實現,最后以文件的形式來完成,請大家和我一起往下看吧
    2022-11-11
  • 教你用Matlab制作黃金礦工小游戲

    教你用Matlab制作黃金礦工小游戲

    黃金礦工作為經典的單機小游戲,一直深受大家的喜愛。本文將用Matlab制作這一款經典的游戲,文中的實現步驟講解詳細,感興趣的可以了解一下
    2022-03-03
  • C++中char[]能修改char*卻不行

    C++中char[]能修改char*卻不行

    本文主要介紹了C++中char[]能修改char*卻不行,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言實現電話訂餐管理系統(tǒng)

    C語言實現電話訂餐管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現電話訂餐管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言高斯消元法的使用詳解

    C語言高斯消元法的使用詳解

    本篇文章是對C語言中高斯消元法的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • c++中typename和class的區(qū)別介紹

    c++中typename和class的區(qū)別介紹

    在c++Template中,很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢?
    2013-03-03
  • c語言尾隊列tailq使用示例分享

    c語言尾隊列tailq使用示例分享

    這篇文章主要介紹了c語言尾隊列tailq使用示例,大家參考使用吧
    2014-01-01
  • C++中std::thread線程用法

    C++中std::thread線程用法

    本文主要介紹了C++中std::thread線程用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • C++中的繼承模式深入詳解

    C++中的繼承模式深入詳解

    這篇文章主要介紹了C++中的繼承模式深入詳解。繼承是OOP設計中的重要概念。在C++語言中,派生類繼承基類有三種繼承方式:私有繼承(private)、保護繼承(protected)和公有繼承(public)。
    2021-03-03

最新評論