最近项目中需要实现 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 平台相关的环境,所以需要把源码单独提取出来,单独编译,防止内部的环境错乱导致移植失败
-
进入到根目录下,并建立独立文件夹作为独立环境区
cd jsoncpp-master && mkdir jsoncpp4Arm
-
将要交叉编译的文件全部拷贝到独立环境区中
# -r:递归整个目录进行拷贝 # include:后面所需要包含的头文件所在地 # src/lib_josn:功能实现文件 cp -r include/ jsoncpp4Arm/ cp src/lib_json/* jsoncpp4Arm/
-
编译动态库
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文件的代码段变为真正意义上的共享
-
对于动态库来说,不像静态库(静态库是在链接可执行文件时,代码段和数据段直接拷贝到可执行文件中),是在运行时加载动态库代码,因此无法在编译和链接阶段获取代码段的符号地址(代码段的符号包括引用的全局数据,调用的函数等)。在调用动态库中的函数时,动态加载器动态分配一段进程地址空间,将动态库加载到该地址空间后,再修改代码段的符号地址。至于需要修改的哪些地址,链接器在动态库的文件头中预先写好,供加载器读取修改
-
编译静态库
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"