开发过程中不可避免的会使用到一些第三方的库。库有静态库和动态库两种:
静态库在编译的时候会链接到最终的目标程序里,在开发单片机时用的.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/
下,会看到编译好的动态库文件: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
<a name="bf79ab3b"></a>
##### zlog 的简单使用
- 1、编码
```c
#include <stdio.h>
#include "zlog.h"
int main(int argc, char** argv)
{
int rc;
zlog_category_t *zc;
char hex_buf[32];
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
```makefile 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、编辑
```shell
cd build/
cmake ..
make -j50
成功后就会在build目录下看到名为zlog的文件。
- 4、执行结果
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
修改为海思的编译器:
执行make clean
清除之前编译文件,然后再重新编译make
!!!将编译好的 lib 文件:libzlog.so
、libzlog.so.1
、libzlog.so.1.2
拷贝到zlog_test/src
替换之前的文件。# Fallback to gcc when $CC is not in $PATH.
CC=/opt/hisi-linux/x86-arm/arm-hisiv600-linux/bin/arm-hisiv600-linux-gnueabi-gcc
2、使用交叉编译工具编译测试工程
修改test.c
文件中zlog.conf
文件的路径,
编译测试工程
将zlog
、zlog.conf
、libzlog.so
、libzlog.so.1
、libzlog.so.1.2
下载到板子上
将libzlog.so
、libzlog.so.1
、libzlog.so.1.2
移动到/usr/lib/
下。**/lib**
和**/usr/lib/**
是动态链接库的默认搜索路径,如果放在其它地方需要将库的位置添加到库的搜索路径之中。
给zlog
文件添加可执行权限后运行,可以看到效果跟在 PC 一样,不过时间就呵呵了
https://www.jianshu.com/p/e0c0a1279e2drc = zlog_init("zlog.conf");
cmake -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/toolChain.cmake .. && make
/opt
zlog 100% |************************************************************************************************************************************| 12260 0:00:00 ETA
/opt
zlog.conf 100% |************************************************************************************************************************************| 218 0:00:00 ETA
/opt
libzlog.so 100% |************************************************************************************************************************************| 298k 0:00:00 ETA
/opt
libzlog.so.1 100% |************************************************************************************************************************************| 298k 0:00:00 ETA
/opt
libzlog.so.1.2 100% |************************************************************************************************************************************| 298k 0:00:00 ETA
/opt
hello libzlog.so libzlog.so.1 libzlog.so.1.2 zlog zlog.conf
/opt # mv libzlog.so* /usr/lib/
/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 ................