<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於後面專案用到了epoll和splice,這些都是unix環境中才有的呼叫,所以我們還是需要在linux環境中開發,我選用的vscode連線linux進行遠端開發
在這裡只跟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++擴充套件
開發一個專案時,一般是由多個程式設計師共同開發維護,如果每個人的編碼習慣風格都不同,整個專案可能風格雜亂,可讀性差,不利於專案維護。clang-format支援的程式碼風格有google、llvm、Chromium Mozilla、WebKit,我們專案使用google風格。
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
輸入以下命令就會按照google的格式在在當前路徑下生成.clang-format檔案。
clang-format -style=google -dump-config > .clang-format
大家只要討論確認clang-format的具體內容,然後在專案根目錄中加入這個檔案,程式碼的風格問題就解決了。
設定在vscode儲存檔案後自動進行格式化
在擴充套件商店中搜尋安裝clang-format外掛
開啟設定面板,之後在輸入框輸入clang-format,在「工作區」tab上找到style選項,修改為「file」,表示按照我們自己定義的.clang-format檔案進行格式化
開啟設定面板,在輸入框中輸入save,在「工作區」tab上把「format on save」選項勾選上
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
除了通過“-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寫法)
隨著專案越來越複雜,模組越來越多,我們繼續手動寫makefile去構建專案顯然不太合適,為了方便管理、構建複雜專案,使用cmake作為構建工具是個不錯的選擇。cmake是一個跨平臺、開源的構建工具,可以方便的產生可移植的makefile,簡化手動寫makefile的工作量。
使用cmake生成makefile檔案並編譯一個分以下流程:
cmake的命令較多,詳細教學可參考https://www.jb51.net/article/180467.htm
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在專案中的使用,可以在根目錄的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登場了。它將在第一遍編譯時多花幾秒鐘,但接下來就會使編譯成倍(5-10倍)的提速。
ccache 的基本原理是通過將標頭檔案快取記憶體到原始檔之中而改進了構建效能,因而通過減少每一步編譯時新增標頭檔案所需要的時間而提高了構建速度。
yum install ccache
在根目錄的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++大型專案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45