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