1. 官网下载源码
github地址:GitHub - open-source-parsers/jsoncpp at update
2. 交叉编译环境
当前平台/开发平台-编译环境:
[root@localroot ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localroot ~]# uname -a
Linux localroot 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@localroot ~]# lscpu | grep Architecture
Architecture: x86_64
目标平台/运行平台-目标环境:
root@linaro-alip:~# uname -a
Linux linaro-alip 4.4.132 #38 SMP Sat Jan 4 15:11:14 CST 2020 armv7l GNU/Linux
root@linaro-alip:~# lscpu | grep Architecture
Architecture: armv7l
3. 交叉编译步骤
1)解压软件包,进入到解压目录,并建立独立文件夹作为独立环境区
mkdir jsoncpp_arm
2)将要交叉编译的文件全部拷贝到独立环境区中
# include:后面所需要包含的头文件所在地
# src/lib_josn:功能实现文件
cp -r ./include/ jsoncpp_arm/
cp src/lib_json/* jsoncpp_arm/
3)编译静态库(当前博客只使用到静态库)
cd jsoncpp_arm/
arm-linux-gnueabihf-g++ -c *.cpp -I./include -fPIC
ar -cr libjsoncpp.a *.o
# ar -cr:把一堆的目标文件.o合成一个库文件,专门链接生成静态库的命令
# c : 即create,创建静态库
# r : 即replace,当静态库改变时,替代原有静态库
注意:arm-linux-gnueabihf-g++ 是对应目标平台/arm平台用到的交叉编译链,查询对应目标平台使用的的是哪种工具链,再对应进行下载安装,进行编译即可。
4)动态库编译
cd jsoncpp_arm/
arm-linux-gnueabihf-g++ -shared -fPIC *.cpp -I./include -o libjsoncpp.so
# shared:把对应的源文件形成对应的动态链接库。
# fPIC:用于生成位置无关的代码(Position-Independent-Code),代码在加载到内存时使用相对地址,所有对固定地址的访问都通过全局偏移表(GOT)来实现 —— 使.so文件的代码段变为真正意义上的共享
4. 程序的编译和使用
1)将编译出来的动态库链接放到系统lib路径下,如 usr/lib/
2)工程代码中使用是包含头文件 "json/json.h"
3)将jsoncpp_arm/include/下的json/文件夹添加到工程目录
否则会报错,找不到头文件:
4)静态库复制
cp /home/libjson/jsoncpp-master/jsoncpp_arm/libjsoncpp.a /usr/local/lib
5)编译程序
# 进入程序目录
arm-linux-gnueabihf-g++ main.cpp -L /usr/local/lib /usr/local/lib/libjsoncpp.a