开发过程中不可避免的会使用到一些第三方的库。库有静态库和动态库两种:
静态库在编译的时候会链接到最终的目标程序里,在开发单片机时用的.lib就属于这类;
动态库在编译时并不会被连接到最终的目标程序,而是在程序运行是才被载入。

在 linux 下开发,日志是主要的调试手段。一个好用日志库好比神兵利器,所谓神兵在手,天下………… zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯 C 日志函数库。下面通过 zlog 来掌握动态库的使用方法。

编译 zlog
  1. tar -zvxf zlog-1.2.14.tar.gz
  2. cd zlog-1.2.14/
  3. make

完成后在zlog-1.2.14/src/下,会看到编译好的动态库文件:libzlog.solibzlog.so.1libzlog.so.1.2

新建测试工程
  • 1、建立zlog_test文件夹,在文件夹内按下面结构创建工程;

    1. .
    2. ├── build
    3. ├── CMakeLists.txt
    4. ├── test.c
    5. └── zlog
    6. ├── libzlog.so
    7. ├── libzlog.so.1
    8. ├── libzlog.so.1.2
    9. ├── zlog.conf
    10. └── 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

  1. <a name="bf79ab3b"></a>
  2. ##### zlog 的简单使用
  3. - 1、编码
  4. ```c
  5. #include <stdio.h>
  6. #include "zlog.h"
  7. int main(int argc, char** argv)
  8. {
  9. int rc;
  10. zlog_category_t *zc;
  11. char hex_buf[32];
  12. rc = zlog_init("../zlog/zlog.conf");
  13. if (rc) {
  14. printf("EEROR: zlog init failed\n");
  15. return -1;
  16. }
  17. zc = zlog_get_category("my_cat");
  18. if (!zc) {
  19. printf("EEROR: zlog get cat fail\n");
  20. zlog_fini();
  21. return -2;
  22. }
  23. zlog_debug(zc, "hello, zlog - debug");
  24. zlog_info(zc, "hello, zlog - info");
  25. zlog_notice(zc, "hello, zlog - notice");
  26. zlog_warn(zc, "hello, zlog - warn");
  27. zlog_error(zc, "hello, zlog - error");
  28. zlog_fatal(zc, "hello, zlog - fatal");
  29. for (int i = 0; i < sizeof(hex_buf); i++)
  30. {
  31. hex_buf[i] = i;
  32. }
  33. hzlog_debug(zc, hex_buf, sizeof(hex_buf));
  34. zlog_fini();
  35. return 0;
  36. }
  • 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)

  1. - 3、编辑
  2. ```shell
  3. cd build/
  4. cmake ..
  5. make -j50

成功后就会在build目录下看到名为zlog的文件。

  • 4、执行结果
    1. 2019-07-23 15:21:00.433 [DEBUG ] hello, zlog - debug
    2. 2019-07-23 15:21:00.433 [INFO ] hello, zlog - info
    3. 2019-07-23 15:21:00.433 [NOTICE] hello, zlog - notice
    4. 2019-07-23 15:21:00.433 [WARN ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:26) hello, zlog - warn
    5. 2019-07-23 15:21:00.433 [ERROR ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:27) hello, zlog - error
    6. 2019-07-23 15:21:00.433 [FATAL ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:28) hello, zlog - fatal
    7. 2019-07-23 15:21:00.433 [DEBUG ]
    8. 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
    9. 0000000001 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
    10. 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.solibzlog.so.1libzlog.so.1.2拷贝到zlog_test/src替换之前的文件。

    1. # Fallback to gcc when $CC is not in $PATH.
    2. CC=/opt/hisi-linux/x86-arm/arm-hisiv600-linux/bin/arm-hisiv600-linux-gnueabi-gcc
  • 2、使用交叉编译工具编译测试工程
    修改test.c文件中zlog.conf文件的路径,
    编译测试工程
    zlogzlog.conflibzlog.solibzlog.so.1libzlog.so.1.2下载到板子上
    libzlog.solibzlog.so.1libzlog.so.1.2移动到/usr/lib/下。**/lib****/usr/lib/**是动态链接库的默认搜索路径,如果放在其它地方需要将库的位置添加到库的搜索路径之中。
    zlog文件添加可执行权限后运行,可以看到效果跟在 PC 一样,不过时间就呵呵了
    https://www.jianshu.com/p/e0c0a1279e2d

    1. rc = zlog_init("zlog.conf");
    1. cmake -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/toolChain.cmake .. && make
    1. /opt
    2. zlog 100% |************************************************************************************************************************************| 12260 0:00:00 ETA
    3. /opt
    4. zlog.conf 100% |************************************************************************************************************************************| 218 0:00:00 ETA
    5. /opt
    6. libzlog.so 100% |************************************************************************************************************************************| 298k 0:00:00 ETA
    7. /opt
    8. libzlog.so.1 100% |************************************************************************************************************************************| 298k 0:00:00 ETA
    9. /opt
    10. libzlog.so.1.2 100% |************************************************************************************************************************************| 298k 0:00:00 ETA
    11. /opt
    12. hello libzlog.so libzlog.so.1 libzlog.so.1.2 zlog zlog.conf
    1. /opt # mv libzlog.so* /usr/lib/
    1. /opt # chmod +x zlog
    2. /opt # ./zlog
    3. 1970-01-01 00:18:30.749 [DEBUG ] hello, zlog - debug
    4. 1970-01-01 00:18:30.749 [INFO ] hello, zlog - info
    5. 1970-01-01 00:18:30.749 [NOTICE] hello, zlog - notice
    6. 1970-01-01 00:18:30.749 [WARN ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:26) hello, zlog - warn
    7. 1970-01-01 00:18:30.749 [ERROR ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:27) hello, zlog - error
    8. 1970-01-01 00:18:30.749 [FATAL ] (my_cat:/home/ubuntu/Documents/zlog_test/test.c:28) hello, zlog - fatal
    9. 1970-01-01 00:18:30.749 [DEBUG ]
    10. 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
    11. 0000000001 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f ................
    12. 0000000002 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................