zlogzlog是一个纯C日志函数库,具有高可靠性、高性能、线程安全、灵活、概念清晰的特点。 Zlog在效率、功能和安全性方面显着优于log4c,并且是用C编写的,并且相对通用。 zlog具有以下特点:
syslog分类模型比log4j模型更直接。自定义日志格式后,它类似于log4j 模式布局。多种输出功能,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出文件,在函数执行过程中手动和自动更新(同时保证安全性),性能较高,在日志上达到每秒25万条日志作者的笔记本电脑。这比syslog(3) 和rsyslogd 的总和快大约1000 倍。确保多线程和多进程环境中安全准确的文件传输只需每微秒调用包装器dzlog(程序默认仅使用一个类别可以由用户扩展的成对表) - 为自定义的字段诊断,以及其他库只要是POSIX系统即可(当然是C99(需要vsnprintf兼容)zlog仓库链接:
https://github.com/HardySimpson/zlog
zlog用户手册:
http://hardysimpson.github.io/zlog/UsersGuide-CN.html
测试.c:
#include #include 'zlog.h'int main(int argc, char** argv){ int rc; zlog_category_t *zc; rc=zlog_init('test.conf'); if (rc) { printf('初始化失败\ n'); return -1; } zc=zlog_get_category('my_cat'); if (!zc) { printf('获取猫失败\n'); zlog_fini(); return -2; } zlog_info(zc, '嵌入zlog_info(zc, '你好,zlog'); zlog_fini(); return 0;}test.conf:
xmakexmake是一个跨平台的安装(编译)工具。 xmake是一个基于Lua的轻量级跨平台构建工具。使用xmake.lua 维护项目构建。相比makefile/CMakeLists.txt,配置语法更加简洁直观。非常适合初学者,并且可以快速上手。快速上手,让用户专注于实际项目开发。 xmake官网:
https://xmake.io/
1. 支持平台: Windows (x86, x64) macOS (i386, x86_64, arm64) Linux (i386, x86_64, cross toolchain.) *BSD (i386, x86_64) Android (x86, x86_64,armeabi,armeabi-v7a,arm64 -v8a)iOS(armv7,armv7s,arm64,i386,x86_64)WatchOS(armv7k,i386)MSYS(i386,x86_64)MinGW(i386,x86_64,arm,arm64)Cygwin(i386,x86_64)Wasm(wasm32)Cross(交叉)工具链.) 2. 支持的工具链3. 支持的语言C/C++Objc/Objc++SwiftAssemblyGolangRustDlangFortranCudaZig (实验) 4. 编译测试多任务并行编译测试:
单任务编译测试:
官网内容非常丰富,对xmake讲解也很详细,有兴趣的朋友可以自行学习。
gear-libgear-lib是一组通用的C基础库。
全部用POSIX C 实现,目标是实现与Linux、Windows、Android 和iOS 的跨平台兼容。适用于物联网、嵌入式、网络服务开发等场景。这包括:
gear-lib非常好用,可以作为日常开发中的工具库。齿轮库地址:
https://github.com/gozfree/gear-lib
inihinih 是一个用C 语言编写的INI 文件解析器。 ini 文件是初始化文件的缩写。 INI 文件由节、键和值组成,注释由分号(;) 表示。例子:
[ip] ;Section1ip_addr=192.168.1.103[test];Section2name=ChengNnum=66 #include #include #include #include 'ini.h'typedef struct{ const char* ip_addr; const char* name; int num;} 配置; static int handler(void* user, const char* section, const char* name, const char* value){configuration* pconfig=(configuration*)user; #define MATCH(s, n) strcmp(section, s)==0 strcmp(name, n)==0 if (MATCH('ip', 'ip_addr')) { pconfig-ip_addr=strdup(value); } else if (MATCH('test', 'name')) { pconfig -name=strdup(value); } else if (MATCH('test', 'num')) { pconfig-num=atoi(value); } else { return 0; /* 未知部分/名称,错误*/} return 1;}int main(int argc, char* argv[]){ config config; config.ip_addr=NULL; /* 设置默认值*/config.name=NULL; config.num=0; if (ini_parse( 'ip .ini', 处理程序, 配置) 0) { printf(''无法加载``ip.ini''\n'); return 1; } printf(''从``ip.ini': 加载配置ip_addr=% s, name=%s, num=%d\n', config.ip_addr, config.name, config.num); if (config.ip_addr) free((void*)config.ip_addr); if (config. name ) free( (void*)config.name); return 0;}queuequeue.h 是Linux 和FreeBSD 上非常有用的头文件。该头文件充满了宏定义操作,因此不仅可以在Linux/嵌入式Linux项目中使用,还可以在单片机项目中使用。使用宏实现以下数据结构。
SLIST:单向无尾链表LIST:双向无尾链表STAILQ:单向无尾链表(可用作队列) TAILQ:双向无尾链表(可用作队列) 所有数据结构支持以下功能:
在链表开头插入节点在任意节点后插入节点删除节点遍历节点该头文件位于Linux 系统上的以下路径中:
/usr/include/sys/queue.h
您也可以从以下网址查看:
https://code.woboq.org/userspace/glibc/misc/sys/queue.h.html
/* * 单链表的定义*/#define SLIST_HEAD(name, type) \struct name { \ struct type *slh_first; /* 第一个元素*/\}#define SLIST_HEAD_INITIALIZER(head)\ { NULL }#define SLIST_ENTRY (type) \struct {\ struct type *sle_next; /* 下一个元素*/\}/* * 单链表函数*/#define SLIST_INIT(head) do { \ (head)-slh_first=NULL; \ } while ( /*CONSTCOND*/0)#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ (elm)-field.sle_next=(slistelm)-field.sle_next; \ (slistelm)-field.sle_next=(elm ) ;\ } while (/*CONSTCOND*/0)#define SLIST_INSERT_HEAD(head, elm, field) do { \ (elm)-field.sle_next=(head)-slh_first; \ (head)-slh_first=(elm) ; \} while (/*CONSTCOND*/0)#define SLIST_REMOVE_HEAD(head, field) do { \ (head)-slh_first=(head)-slh_first-field.sle_next; \} while (/*CONSTCOND*/0) #定义SLIST_REMOVE (head, elm, type, field) do { \ if ((head)-slh_first==(elm)) {\ SLIST_REMOVE_HEAD((head), field); \ } \ else {\ 结构类型*curelm=( head) -slh_first; \ while(curelm-field.sle_next !=(elm)) \curelm=curelm-field.sle_next; \curelm-field.sle_next=\curelm-field.sle_next-field.sle_next; \ } \ } while ( /*CONSTCOND*/0)#define SLIST_FOREACH(var, head, field)\ for((var)=(head)-slh_first; (var); (var)=(var)-field.sle_next)/* * Single链表访问方式*/#define SLIST_EMPTY(head) ((head)-slh_first==NULL)#define SLIST_FIRST(head) ((head)-slh_first)#define SLIST_NEXT(elm, field) (( elm) )-field .sle_next)cJSONhttps://github.com/DaveGamble/cJSON.git
JSON(JavaScript 对象表示法)是一种轻量级数据交换格式。 JSON 的简单性和清晰的层次结构使其成为理想的数据交换语言。易于人类读写,易于机器解析生成,有效提高网络传输效率。 cJSON 是一个用C 语言编写的库,用于解析和打包JSON 数据。
protobufhttps://github.com/protocolbuffers/protobuf
Protocol buffers 是Google 开发的一种数据格式。它与XML 类似,允许序列化结构化数据。可用于数据存储、通信协议等。它独立于语言和平台并且具有高度可扩展性。 JSON类型的数据具有极好的可读性,但由于整个数据包中都包含无用的数据,自然就带来了一定的通信负载。 protobuf 是一种比JSON 更轻量级的数据格式。 protobuf的优点:
强大的可扩展性。消息格式升级,提高兼容性支持跨平台多语言序列化和反序列化相比Json或XML序列化量极低,适合网络发送文章有帮助如果您喜欢,请点赞、收藏、转发,谢谢!私信回复Embedded Book即可领取博主精心编辑的嵌入式电子书。