這里推薦一款嵌入式的cpp框架與封裝代碼,小而輕量級(jí),很不錯(cuò)的開(kāi)源代碼。交叉編譯也很方便,模塊化編譯,可根據(jù)需要選擇編譯模塊。
全稱: C++ Treasure Box,C++百寶箱,是一個(gè)基于 Reactor 模式的服務(wù)型?開(kāi)發(fā)框架?與?組件庫(kù),旨在讓C++開(kāi)發(fā)變得輕松。
應(yīng)用場(chǎng)景
??智能硬件,如:機(jī)器人(掃地機(jī)、商用服務(wù)機(jī)器人)、IPC、無(wú)人機(jī)、車(chē)載等;
??邊緣計(jì)算組件,如:智能家居網(wǎng)關(guān)、IOT邊緣網(wǎng)關(guān)等;
??后臺(tái)服務(wù)型軟件,如:SOCKS5、中間件
參考項(xiàng)目:
??cpp-socks5[5];
特點(diǎn)
1. 基于Reactor模型
參考 Node.js 的 Reactor 模式。
主線程以 Reactor 模式處理非阻塞 IO 事件,并配合 ThreadPool 執(zhí)行大運(yùn)算與阻塞性操作。
該模式避免了多線程模式競(jìng)態(tài)加鎖的煩惱,程序穩(wěn)定可靠。
2. 內(nèi)含main框架,開(kāi)箱即用
使用內(nèi)置的 main 框架處理了所有與業(yè)務(wù)無(wú)關(guān)的工作。您不需要關(guān)心日志怎么輸出、參數(shù)怎么解析、程序怎么退出、main函數(shù)怎么寫(xiě)這些瑣碎的事情。main框架都為您處理好了。
您只需要派生tbox::main::Module
類(lèi),填寫(xiě)業(yè)務(wù)代碼,然后注冊(cè)到框架即可。
3. 具有類(lèi)Shell的命令終端
可以與運(yùn)行中的服務(wù)通過(guò)telnet進(jìn)行交互,令其打印內(nèi)部數(shù)據(jù),或是執(zhí)行特定的動(dòng)作。這極大地降低了調(diào)試難度。
shell交互示例
4. 完備的日志系統(tǒng)
1) 有三種日志輸出渠道:stdout + filelog + syslog
??stdout,將日志通過(guò)?std::cout
?輸出到終端;
??syslog,將日志通過(guò)?syslog()
?輸出到系統(tǒng)日志;
??filelog,將日志寫(xiě)入到指定目錄下,以格式:前綴.年月日_時(shí)分秒.進(jìn)程號(hào).log
?的文件中。文件大小超過(guò)1M則另創(chuàng)建新的日志文件。由于寫(xiě)文件效率低,該輸出渠道采用前后端模式。
三種渠道可以啟動(dòng)參數(shù)中選定一個(gè)或同時(shí)多種,也可在運(yùn)行時(shí)通過(guò)終端更改。
2) 根據(jù)日志等級(jí)渲染不同顏色,一目了然,內(nèi)容詳盡
日志內(nèi)容包含了:等級(jí)、時(shí)間(精確到微秒)、線程號(hào)、模塊名、函數(shù)名、正文、文件名、行號(hào)。
方便快速定位問(wèn)題。
日志打印展示
3) 靈活的日志輸出過(guò)濾器,且能運(yùn)行時(shí)修改
可在程序運(yùn)行時(shí)針對(duì)不同的模塊單獨(dú)設(shè)置日志等級(jí),如下:
設(shè)置日志等級(jí)
5. 靈活的參數(shù)系統(tǒng),以不變應(yīng)萬(wàn)變
參數(shù)以JSON的格式提供,可以傳入任何格式的運(yùn)行參數(shù),包括:整數(shù)、小數(shù)、字串、數(shù)組、組合參數(shù),滿足幾乎所有參數(shù)傳入需求:
參數(shù)help
在執(zhí)行時(shí)可以使用?-c your_cfg_file.json
?導(dǎo)入JSON格式的配置文件。同時(shí)還可以使用配合?-s 'xx.yy.zz=vvv'
?臨時(shí)指定參數(shù)。
而JSON格式的配置文件還支持include指令,在加載時(shí)去包含其它的配置文件。
6. 跨線程委派任務(wù),無(wú)需加鎖
子線程委托主線程執(zhí)行:
runInLoop示例
主線程委托子線程執(zhí)行:
ThreadPool示例
7. 支持優(yōu)雅的退出流程
在接收到信號(hào):SIGINT, SIGTERM, SIGQUIT, SIGPWR 時(shí),會(huì)有序地執(zhí)行退出流程,釋放資源。做到干凈地退出。
友好地退出
8. 有全面的異常捕獲機(jī)制
當(dāng)程序出現(xiàn)各種程序異常,如:段錯(cuò)誤、斷言、總線錯(cuò)誤、異常未捕獲等,架框會(huì)捕獲并在日志系統(tǒng)中打印完整的調(diào)用棧。面對(duì)程序崩潰,不再一臉茫然。效果如下:
異常棧打印
9. 有豐富的開(kāi)發(fā)組件
庫(kù)名 | 中文名 | 說(shuō)明 |
base | 基礎(chǔ)庫(kù) | 含日志打印、常用工具等 |
util | 工具庫(kù) | 在業(yè)務(wù)代碼中可能會(huì)用到的庫(kù) |
event | 事件庫(kù) | 實(shí)現(xiàn)了IO,Timer,Signal三種事件驅(qū)動(dòng),是整個(gè)框架的心臟 |
eventx | 事件擴(kuò)展庫(kù) | 含 ThreadPool 線程池,WorkThread工作線程,TimerPool 定時(shí)器池等模塊 |
log | 日志輸出庫(kù) | 實(shí)現(xiàn)了終端、syslog、文件形式的日志輸出 |
network | 網(wǎng)絡(luò)庫(kù) | 實(shí)現(xiàn)了串口、終端、UDP、TCP 通信模塊 |
terminal | 終端 | 類(lèi)似shell的命令終端,可實(shí)現(xiàn)運(yùn)行時(shí)與程序進(jìn)行命令交互 |
main | 主框架 | 實(shí)現(xiàn)了完備的程序啟動(dòng)流程與框架,讓開(kāi)發(fā)者只需關(guān)心業(yè)務(wù)代碼 |
run | 執(zhí)行器 | 是個(gè)可執(zhí)行程序,可加載多個(gè)由參數(shù)-l xxx 指定的動(dòng)態(tài)庫(kù),并運(yùn)行其中的Module |
mqtt | MQTT客戶端庫(kù) | |
coroutine | 協(xié)程庫(kù) | 眾所周知,異步框架不方便處理順序性業(yè)務(wù),協(xié)程彌補(bǔ)之 |
http | HTTP庫(kù) | 在network的基礎(chǔ)上實(shí)現(xiàn)了HTTP的Server與Client模塊 |
alarm | 鬧鐘模塊 | 實(shí)現(xiàn)了4種常用的鬧鐘:CRON鬧鐘、單次鬧鐘、星期循環(huán)鬧鐘、工作日鬧鐘 |
flow | 流程模塊 | 含多層級(jí)狀態(tài)機(jī)與行為樹(shù),解決異步模式下動(dòng)行流程問(wèn)題 |
適用環(huán)境
??Linux 系統(tǒng);
? C++11 以上。
下載與構(gòu)建
準(zhǔn)備
sudo?apt?update
sudo?apt?install?build-essential
sudo?apt?install?libgtest-dev?libgmock-dev
sudo?apt?install?libmosquitto-dev
sudo?apt?install?libdbus-1-dev
git?clone?https://gitee.com/cpp-master/cpp-tbox.git
cd?cpp-tbox
方法一:GNU Make
make?3rd-party?modules?RELEASE=1
完成之后,頭文件與庫(kù)文件都在 .staging 目錄下。
當(dāng)然也可以通過(guò)指定?STAGING_DIR
?對(duì)頭文件與庫(kù)文件的生成路徑進(jìn)行指定。
如:
make?3rd-party?modules?RELEASE=1?STAGING_DIR=$HOME/.tbox
完成之后,頭文件與庫(kù)文件都在 $HOME/.tbox 路徑下。
方法二:CMake
cmake?-B?build
cmake?--build?build
cmake?--install?build
通過(guò)指定CMAKE_INSTALL_PREFIX
?自定義安裝目錄(默認(rèn)安裝在/usr/local):
cmake?-B?build?-DCMAKE_INSTALL_PREFIX=$HOME/.tbox
使用教程
關(guān)于如何使用 cpp-tbox 開(kāi)發(fā)自己的程序,詳見(jiàn)教程:?cpp-tbox-tutorials[6]
使用find_package
的例子:
cmake_minimum_required(VERSION?3.10)
project(tbox-find_package)
find_package(tbox?COMPONENTS?base?util?alarm?event?eventx)
add_executable(demo?main.cpp)
target_link_libraries(demo?PRIVATE?tbox::tbox_base?tbox::tbox_util?tbox::tbox_alarm?tbox::tbox_event?tbox::tbox_eventx)
外部庫(kù)依賴
庫(kù)名 | 依賴模塊 | 必需 | 說(shuō)明 | 安裝方法 |
libgtest-dev | 所有 | 否 | 單元測(cè)試用 | sudo apt install libgtest-dev |
libgmock-dev | 所有 | 否 | 單元測(cè)試用 | sudo apt install libgmock-dev |
libmosquitto-dev | mqtt | no | MQTT | sudo apt install libmosquitto-dev |
libdbus-1-dev | dbus | no | DBus | sudo apt install libdbus-1-dev |
配置
你可以決定哪些模塊需要構(gòu)建,哪些不需要。
打開(kāi) config.mk 文件,將不需要模塊對(duì)應(yīng)?app_y += xxx
?屏蔽即可,但要注意模塊間的依賴性。
許可
MIT[7],可免費(fèi)商用。
代碼開(kāi)源倉(cāng)連接
代碼碼云:https://gitee.com/cpp-master/cpp-tbox?_from=gitee_search