> 文章列表 > ARM平台移植jsoncpp库

ARM平台移植jsoncpp库

ARM平台移植jsoncpp库

最近项目中需要实现 HTTP API 的接口,需要对 JSON 格式的数据进行解析,之前学习使用过一个轻量级的json解析库 JSONCPP ,所以这里就打算将 jsoncpp 库移植到ARM项目工程中,下面简要记录一下移植步骤

01 | Jsoncpp 库源码下载

GitHub - open-source-parsers/jsoncpp: A C++ library for interacting with JSON.

因为项目中ARM平台使用的是 LINUX 系统,所以在Linux 系统下下载 jsoncpp 源码

git clone https://github.com/open-source-parsers/jsoncp

02 | ARM编译

应用层的移植,就是要将交叉编译器和工具链换成新处理器上的重新编译能够成功,比如之前用的是 arm-linux-gcc 现在换成 arm-none-linux-gnueabihf 也能正常run起来。

因为在下载的 jsoncpp 源码中,并没有设立 Linux ARM 平台相关的环境,所以需要把源码单独提取出来,单独编译,防止内部的环境错乱导致移植失败

  1. 进入到根目录下,并建立独立文件夹作为独立环境区

    cd jsoncpp-master && mkdir jsoncpp4Arm
    
  2. 将要交叉编译的文件全部拷贝到独立环境区中

    # -r:递归整个目录进行拷贝
    # include:后面所需要包含的头文件所在地
    # src/lib_josn:功能实现文件
    cp -r include/ jsoncpp4Arm/
    cp src/lib_json/* jsoncpp4Arm/
    
  3. 编译动态

    cd jsoncpp4Arm
    # arm-none-linux-gnueabihf-g++ 是对应 ARM 平台用到的交叉编译链,如	果使用的是 arm-linux-gueabihf 的话,就替换成 arm-linux-gueabihf-g++
    arm-none-linux-gnueabihf-g++ -shared -fPIC *.cpp -I./include -o libjsoncpp.so
    
    • shared:把对应的源文件形成对应的动态链接库。

    • fPIC:用于生成位置无关的代码(Position-Independent-Code),代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现 —— 使.so文件的代码段变为真正意义上的共享

对于动态库来说,不像静态库(静态库是在链接可执行文件时,代码段和数据段直接拷贝到可执行文件中),是在运行时加载动态库代码,因此无法在编译和链接阶段获取代码段的符号地址(代码段的符号包括引用的全局数据,调用的函数等)。在调用动态库中的函数时,动态加载器动态分配一段进程地址空间,将动态库加载到该地址空间后,再修改代码段的符号地址。至于需要修改的哪些地址,链接器在动态库的文件头中预先写好,供加载器读取修改

  1. 编译静态库

    arm-none-linux-gnueabihf-g++ -c *.cpp -I./include -fPIC
    ar -cr libjsoncpp.a *.o
    
    • ar -cr:把一堆的目标文件.o合成一个库文件,专门链接生成静态库的命令

      • c : 即create,创建静态库

      • r : 即replace,当静态库改变时,替代原有静态库

03 | jsoncpp移植到工程

  • 将编译出来的动态库链接放到系统lib路径下,如 usr/lib/

  • 将独立环境区中的 include/ 下的 json/文件夹添加到工程对应的 include/

  • 在工程应用编译文件 Makefile 的链接库中增加 -ljsoncpp

  • 工程代码中使用是包含头文件 "json/json.h"