开发过程中不可避免的会使用到一些第三方的库。库有静态库和动态库两种:静态库在编译的时候会链接到最终的目标程序里,在开发单片机时用的.lib
就属于这类,动态库在编译时并不会被连接到最终的目标程序,而是在程序运行是才被载入。
在linux下开发,日志是主要的调试手段。一个好用日志库好比神兵利器,所谓神兵在手,天下………… zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。下面通过zlog来掌握动态库的使用方法。
编译zlog
tar -zvxf zlog-1.2.14.tar.gz
cd zlog-1.2.14/
make
完成后在zlog-1.2.14/src/
下,会看到编译好的lib文件:libzlog.so
、libzlog.so.1
、libzlog.so.1.2
新建测试工程
- 1、建立
zlog_test
文件夹,在文件夹内按下面结构创建工程;. ├── build ├── CMakeLists.txt ├── test.c └── zlog ├── libzlog.so ├── libzlog.so.1 ├── libzlog.so.1.2 ├── zlog.conf └── zlog.h
- 2、编辑zlog配置文件
下面的配置只是简单使用,需要适合自己的配置可以参考zlog使用手册进行更改。[levels] [formats] time = "%d(%F %T).%ms [%-6V] %m%n" file = "%d(%F %T).%ms [%-6V] (%c:%F:%L) %m%n" [rules] my_cat.WARN >stdout;file my_cat.=NOTICE >stdout;time my_cat.=INFO >stdout;time my_cat.=DEBUG >stdout;time
zlog的简单使用
-
1、编码
#include <stdio.h> #include "zlog.h" int main(int argc, char** argv) { int rc; zlog_category_t *zc; char hex_buf[32]; /* 执行文件在build目录下,下面的路径是配置文件相对于执行文件的路径 */ rc = zlog_init("../zlog/zlog.conf"); if (rc) { printf("EEROR: zlog init failed\n"); return -1; } zc = zlog_get_category("my_cat"); if (!zc) { printf("EEROR: zlog get cat fail\n"); zlog_fini(); return -2; } zlog_debug(zc, "hello, zlog - debug"); zlog_info(zc, "hello, zlog - info"); zlog_notice(zc, "hello, zlog - notice"); zlog_warn(zc, "hello, zlog - warn"); zlog_error(zc, "hello, zlog - error"); zlog_fatal(zc, "hello, zlog - fatal"); for (int i = 0; i < sizeof(hex_buf); i++) { hex_buf[i] = i; } hzlog_debug(zc, hex_buf, sizeof(hex_buf)); zlog_fini(); return 0; }
-
2、编写
CMakeLists.txt
cmake_minimum_required (VERSION 3.14) # 版本不要太低,不然后续交叉编译时会失败 project (zlog) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -g") # 添加zlog的头文件搜索路径 include_directories ("${PROJECT_SOURCE_DIR}/zlog") add_executable(zlog test.c) # 链接到zlog target_link_libraries (zlog ${PROJECT_SOURCE_DIR}/zlog/libzlog.so)
-
3、执行结果
2019-07-23 15:21:00.433 [DEBUG ] hello, zlog - debug 2019-07-23 15:21:00.433 [INFO ] hello, zlog - info 2019-07-23 15:21:00.433 [NOTICE] hello, zlog - notice 2019-07-23 15:21:00.433 [WARN ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:26) hello, zlog - warn 2019-07-23 15:21:00.433 [ERROR ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:27) hello, zlog - error 2019-07-23 15:21:00.433 [FATAL ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:28) hello, zlog - fatal 2019-07-23 15:21:00.433 [DEBUG ] 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF 0000000001 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................ 0000000002 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
在板子上的效果
-
1、使用交叉编译工具编译zlog
将zlog-1.2.14/src
中MakeFile文件里的CC
修改为海思的编译器:# Fallback to gcc when $CC is not in $PATH. CC=/opt/hisi-linux/x86-arm/arm-hisiv600-linux/bin/arm-hisiv600-linux-gnueabi-gcc
执行
make clean
清除之前编译文件,然后再重新编译make
!!!将编译好的lib文件:libzlog.so
、libzlog.so.1
、libzlog.so.1.2
拷贝到zlog_test/src
替换之前的文件。 -
2、使用交叉编译工具编译测试工程
修改test.c
文件中zlog.conf
文件的路径,// 修改为执行文件的当前目录 rc = zlog_init("zlog.conf");
编译测试工程
cmake -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/toolChain.cmake .. && make
将
zlog
、zlog.conf
、libzlog.so
、libzlog.so.1
、libzlog.so.1.2
下载到板子上/opt # tftp -g -r zlog 192.168.1.174 zlog 100% |************************************************************************************************************************************| 12260 0:00:00 ETA /opt # tftp -g -r zlog.conf 192.168.1.174 zlog.conf 100% |************************************************************************************************************************************| 218 0:00:00 ETA /opt # tftp -g -r libzlog.so 192.168.1.174 libzlog.so 100% |************************************************************************************************************************************| 298k 0:00:00 ETA /opt # tftp -g -r libzlog.so.1 192.168.1.174 libzlog.so.1 100% |************************************************************************************************************************************| 298k 0:00:00 ETA /opt # tftp -g -r libzlog.so.1.2 192.168.1.174 libzlog.so.1.2 100% |************************************************************************************************************************************| 298k 0:00:00 ETA /opt # ls hello libzlog.so libzlog.so.1 libzlog.so.1.2 zlog zlog.conf
将
libzlog.so
、libzlog.so.1
、libzlog.so.1.2
移动到/usr/lib/
下。/lib
和/usr/lib/
是动态链接库的默认搜索路径,如果放在其它地方需要将库的位置添加到库的搜索路径之中。/opt # mv libzlog.so* /usr/lib/
给
zlog
文件添加可执行权限后运行,可以看到效果跟在PC一样,不过时间就呵呵了/opt # chmod +x zlog /opt # ./zlog 1970-01-01 00:18:30.749 [DEBUG ] hello, zlog - debug 1970-01-01 00:18:30.749 [INFO ] hello, zlog - info 1970-01-01 00:18:30.749 [NOTICE] hello, zlog - notice 1970-01-01 00:18:30.749 [WARN ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:26) hello, zlog - warn 1970-01-01 00:18:30.749 [ERROR ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:27) hello, zlog - error 1970-01-01 00:18:30.749 [FATAL ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:28) hello, zlog - fatal 1970-01-01 00:18:30.749 [DEBUG ] 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF 0000000001 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................ 0000000002 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................
网友评论