用VScode編寫C++大型項(xiàng)目的方法步驟
vscode遠(yuǎn)程開發(fā)配置
由于后面項(xiàng)目用到了epoll和splice,這些都是unix環(huán)境中才有的調(diào)用,所以我們還是需要在linux環(huán)境中開發(fā),我選用的vscode連接linux進(jìn)行遠(yuǎn)程開發(fā)
選用vscode的原因
在這里只跟clion做下比較,clion支持的full remote development,基本原理是自動(dòng)同步本地目錄和遠(yuǎn)端服務(wù)器目錄,在寫代碼時(shí),用的還是本地環(huán)境,無(wú)法識(shí)別unix特有的那些頭文件。
而vscode的遠(yuǎn)程開發(fā),是把開發(fā)者自己機(jī)器上的 VSCode 原樣拷貝到作為目標(biāo)機(jī)器(Remote Host)上,以服務(wù)的形式運(yùn)行,而本地的 VSCode 作為客戶端,兩者之間通過遠(yuǎn)程通訊協(xié)議彼此協(xié)調(diào)合作,實(shí)際上的開發(fā)工作主要是在服務(wù)端完成的。
配置流程
支持ssh公鑰登錄遠(yuǎn)程服務(wù)器
安裝remote-ssh遠(yuǎn)程插件

安裝后重啟可以在側(cè)邊欄看見這個(gè)

添加ssh target
點(diǎn)擊「SSH TARGETS」旁邊的「Configure」,選擇編輯第一個(gè)文件(用戶目錄下的.ssh/config)

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

?添加遠(yuǎn)程工作區(qū)
點(diǎn)擊「RemoteServer」后面的connection按鈕,會(huì)打開一個(gè)新vscode窗口,等待連接遠(yuǎn)程服務(wù)器并完成一些初始化工作后,可點(diǎn)擊「Open Folder」添加服務(wù)器的目錄。

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

?clang-format格式化代碼
開發(fā)一個(gè)項(xiàng)目時(shí),一般是由多個(gè)程序員共同開發(fā)維護(hù),如果每個(gè)人的編碼習(xí)慣風(fēng)格都不同,整個(gè)項(xiàng)目可能風(fēng)格雜亂,可讀性差,不利于項(xiàng)目維護(hù)。clang-format支持的代碼風(fēng)格有g(shù)oogle、llvm、Chromium Mozilla、WebKit,我們項(xiàng)目使用google風(fēng)格。
安裝clang-format
ubuntu安裝
直接從apt倉(cāng)庫(kù)安裝即可
sudo apt-get install clang-format
centos安裝
centos 的yum倉(cāng)庫(kù)中并沒有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變量中,所以這個(gè)時(shí)候在命令行還找不到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文件
輸入以下命令就會(huì)按照google的格式在在當(dāng)前路徑下生成.clang-format文件。
clang-format -style=google -dump-config > .clang-format
大家只要討論確認(rèn)clang-format的具體內(nèi)容,然后在項(xiàng)目根目錄中加入這個(gè)文件,代碼的風(fēng)格問題就解決了。
vscode支持clang-format
配置在vscode保存文件后自動(dòng)進(jìn)行格式化
在擴(kuò)展商店中搜索安裝clang-format插件

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

打開設(shè)置面板,在輸入框中輸入save,在「工作區(qū)」tab上把「format on save」選項(xiàng)勾選上

代碼檢查工具clang-tidy
clang-tidy是一個(gè)功能十分強(qiáng)大的代碼檢查工具,能幫助我們現(xiàn)代化代碼,提高代碼的可讀性
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. 后面的`--`表示這個(gè)文件不在compilation database里面,可以直接單獨(dú)編譯; $ clang-tidy -checks="-*,misc-unused-using-decls" path/to/simple.cc -- // 找出simple.cc中所有沒有用到的using declarations并自動(dòng)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會(huì)從目錄下查找compliation database,這個(gè)database就是compile_commands.json文件,里面包含該項(xiàng)目中所有的編譯單元的編譯命令。 在使用之前要導(dǎo)出這個(gè)文件。目前已經(jīng)有工具幫我們做了這項(xiàng)工作。
如果是cmake的項(xiàng)目,通過cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources命令導(dǎo)出;
cmake版本需要大于3.5
- 如果是GYP項(xiàng)目,通過ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.json;
- 如果是make項(xiàng)目,使用Bear工具;
除了通過“-checks=”來(lái)設(shè)定檢查規(guī)則,還可以在項(xiàng)目主目錄之下添加.clang-tidy文件,在里面編寫項(xiàng)目的檢查規(guī)則,這種方式更加適合對(duì)整個(gè)項(xiàng)目進(jìn)行定制化的規(guī)則編寫。.clang-tidy文件并不是必須放在主目錄之下,只是通常放在主目錄之下方便對(duì)整個(gè)項(xiàng)目進(jìn)行檢查。
# .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上面的使用方法中,一次只能分析一個(gè)文件,如何一次性分析整個(gè)項(xiàng)目的文件呢?clang-tidy提供了run_clang_tidy.py腳本,通過多進(jìn)程的方法對(duì)整個(gè)項(xiàng)目文件進(jìn)行分析。(具體使用方法可參考下面的cmake寫法)
cmake實(shí)現(xiàn)代碼工程化
隨著項(xiàng)目越來(lái)越復(fù)雜,模塊越來(lái)越多,我們繼續(xù)手動(dòng)寫makefile去構(gòu)建項(xiàng)目顯然不太合適,為了方便管理、構(gòu)建復(fù)雜項(xiàng)目,使用cmake作為構(gòu)建工具是個(gè)不錯(cuò)的選擇。cmake是一個(gè)跨平臺(tái)、開源的構(gòu)建工具,可以方便的產(chǎn)生可移植的makefile,簡(jiǎn)化手動(dòng)寫makefile的工作量。
使用cmake生成makefile文件并編譯一個(gè)分以下流程:
- 在根目錄及每個(gè)模塊目錄下編寫CMakeLists.txt
- 在根目錄創(chuàng)建一個(gè)build文件夾
- 進(jìn)入build目錄,執(zhí)行cmake …/ 生成整個(gè)項(xiàng)目的makefile
- 執(zhí)行make和make install進(jìn)行編譯和安裝。
cmake的命令較多,詳細(xì)教程可參考http://www.dbjr.com.cn/article/180467.htm
cmake實(shí)踐
CProxy的代碼目錄結(jié)構(gòu)如下
├── client │ ├── xxx.cpp │ ├── ... ├── lib │ ├── xxx.cpp │ ├── ... ├── server │ ├── xxx.cpp │ ├── ...
server目錄是CProxy服務(wù)端目錄,client目錄是CProxy客戶端目錄,server和client分別能構(gòu)建出可執(zhí)行的程序;lib目錄則存放一些被server和client調(diào)用的庫(kù)函數(shù)。
首先,我們先在項(xiàng)目根目錄上創(chuàng)建一個(gè)CMakeLists.txt
# cmake_minimum_required:指定了當(dāng)前工程支持的cmake最小版本
cmake_minimum_required(VERSION 3.1)
# project:指定工程名稱
project(CProxy)
# CMake 中有一個(gè)變量 CMAKE_BUILD_TYPE ,可以的取值是 Debug、Release、RelWithDebInfo和 MinSizeRel。
# 當(dāng)這個(gè)變量值為 Debug 的時(shí)候,CMake 會(huì)使用變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作為編譯選項(xiàng)生成 Makefile; 當(dāng)變量值為Release時(shí),則會(huì)使用CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 中的字符串作為編譯選項(xiàng)生成 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")
# 設(shè)置 c++ 編譯器,這里使用clang++進(jìn)行編譯
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:將指定目錄添加到編譯器的頭文件搜索路徑之下,指定的目錄被解釋成當(dāng)前源碼路徑的相對(duì)路徑。
# 將工程根目錄添加進(jìn)來(lái)后,在server和client中能通過"lib/xxx"引入lib目錄下的頭文件
include_directories(${PROJECT_SOURCE_DIR})
# 添加子目錄,并構(gòu)建該子目錄。
# 會(huì)執(zhí)行l(wèi)ib、server、client三個(gè)目錄中的CMakeLists.txt
add_subdirectory(lib)
add_subdirectory(server)
add_subdirectory(client)上面的CMakeLists.txt添加了lib、server、client三個(gè)子目錄,所以需要在這三個(gè)目錄中也添加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:將目標(biāo)文件與庫(kù)文件進(jìn)行鏈接
# 使用多線程需要引入pthread庫(kù),所以將pthread庫(kù)鏈接到上一步創(chuàng)建的lib目標(biāo)文件中
target_link_libraries(lib pthread)
// client/CMakeLists.txt
# 將client目錄下的所有源文件都存儲(chǔ)到SOURCE_DIR變量中。
aux_source_directory(./ SOURCE_DIR)
# 將${SOURCE_DIR}中的所有源文件編譯成Client可執(zhí)行文件
add_executable(Client ${SOURCE_DIR})
# 生成可執(zhí)行文件需要鏈接lib庫(kù)
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 .. 生成整個(gè)項(xiàng)目的makefile
mkdir build cd build cmake ..
在build目錄下執(zhí)行make進(jìn)行編譯
make
clang-tidy在cmake中的配置
為了方便clang-tidy在項(xiàng)目中的使用,可以在根目錄的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, 即可對(duì)整個(gè)項(xiàng)目進(jìn)行代碼分析。
ccache加速編譯
隨著項(xiàng)目代碼量越來(lái)越多,編譯花費(fèi)的時(shí)間會(huì)很長(zhǎng),在調(diào)試代碼時(shí),我們可能只改了一行代碼,每次要編譯個(gè)幾分鐘。這個(gè)時(shí)候就輪到ccache登場(chǎng)了。它將在第一遍編譯時(shí)多花幾秒鐘,但接下來(lái)就會(huì)使編譯成倍(5-10倍)的提速。
ccache 的基本原理是通過將頭文件高速緩存到源文件之中而改進(jìn)了構(gòu)建性能,因而通過減少每一步編譯時(shí)添加頭文件所需要的時(shí)間而提高了構(gòu)建速度。
ccache安裝
yum install ccache
結(jié)合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)重新進(jìn)行編譯,會(huì)發(fā)現(xiàn)第一遍還是比較久,但之后的編譯速度就會(huì)變的很快了。
到此這篇關(guān)于用VScode編寫C++大型項(xiàng)目的方法步驟的文章就介紹到這了,更多相關(guān)VScode編寫C++大型項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言通過三種方法實(shí)現(xiàn)屬于你的通訊錄
本文將實(shí)現(xiàn)一個(gè)通訊錄,來(lái)實(shí)現(xiàn)人員的增刪插改功能。文中通過三種形式來(lái)實(shí)現(xiàn)用戶的增刪插改,其實(shí)也就是一點(diǎn)點(diǎn)的優(yōu)化版本,從靜態(tài)的實(shí)現(xiàn),到動(dòng)態(tài)的實(shí)現(xiàn),最后以文件的形式來(lái)完成,請(qǐng)大家和我一起往下看吧2022-11-11
C語(yǔ)言實(shí)現(xiàn)電話訂餐管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電話訂餐管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

