Jsoncpp搭建交叉编译环境(移植到arm)

时间:2024-04-25 20:20:45

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