交叉编译 cJSON
概述
JSON 是一种轻量级数据交换格式。它可以表示数据、字符串、有序的值序列以及名称/值对的集合。
cJSON 是 ANSI C 中超轻量级的 JSON 解析器。cJSON 旨在成为您可以完成任务的最简单的解析器。它是一个 C 文件和一个头文件。作为一个库,cJSON 的存在是为了尽可能地减少跑腿活儿的工作,但不会妨碍您的工作。作为实用主义的观点(即忽略事实),我想说,你可以在两种模式中使用它:自动和手动。
有几种方法可以将cJSON合并到项目中。
因为整个库只有一个 C 文件和一个头文件,所以您只需将 cJSON.h
和 cJSON.c
复制到项目源代码并开始使用它。
cJSON 是用 ANSI C(C89)编写的,以支持尽可能多的平台和编译器。
- GitHub: https://github.com/DaveGamble/cJSON
下载
开发版本 (最新)
如果以研究学习为目的,或者希望尝试最新特性,又或者希望参与到 cJSON 的开发中,可以直接从 github 上拉取最新源码,拉取命令:
git clone https://github.com/DaveGamble/cJSON.git
技巧:在 github 页面点击右上角的
Code
按钮获取 git clone 链接。
发行版本
如果以商用量产为目的,一般选择正式的发行版本为佳。在 cJSON 的 Release 页面,源码以压缩包的形式提供,根据需求选择合适的版本进行下载,以最新的 1.7.15 为例,下载源码包 Source Code (tar.gz).
也可以直接使用 wget
命令下载:
wget https://github.com/DaveGamble/cJSON/archive/refs/tags/v1.7.15.tar.gz
交叉编译
解压缩源码包,如果使用 git clone
拉回来的代码可以忽略这一步
tar -xvf v1.7.15.tar.gz
解压缩源码包之后可以先阅读 README.md 文档,里面有关于使用 cmake 工具构建 cJSON 的相关信息。
cJSON 使用了 CMake 编译系统,需要保证系统中已经安装了 cmake 工具。可以使用 apt
命令进行安装:
sudo apt install -y cmake
创建一个环境配置文件 aarch64-environment-setup
,配置最重要的交叉编译环境变量。
aarch64-environment-setup:
export TOOLCHAIN_ROOT=/opt/toolchains/aarch64--glibc--stable-2022.03-1
export BUILDSYSROOT=$TOOLCHAIN_ROOT/aarch64-buildroot-linux-gnu/sysroot
export PATH=$TOOLCHAIN_ROOT/bin:$PATH
export PREFIX=/usr
export CC="aarch64-linux-gcc --sysroot=$BUILDSYSROOT"
export CXX="aarch64-linux-g++ --sysroot=$BUILDSYSROOT"
export CPP="aarch64-linux-gcc -E --sysroot=$BUILDSYSROOT"
export LD="aarch64-linux-ld --sysroot=$BUILDSYSROOT"
export AR=aarch64-linux-ar
export AS=aarch64-linux-as
export NM=aarch64-linux-nm
export GDB=aarch64-linux-gdb
export OBJDUMP=aarch64-linux-objdump
export OBJCOPY=aarch64-linux-objcopy
export RANLIB=aarch64-linux-ranlib
export READELF=aarch64-linux-readelf
export STRIP=aarch64-linux-strip
export PKG_CONFIG_SYSROOT_DIR=$BUILDSYSROOT
export PKG_CONFIG_PATH=$BUILDSYSROOT/usr/lib/pkgconfig:$BUILDSYSROOT/usr/share/pkgconfig
在本示例中,交叉编译工具位于 /opt/toolchains/aarch64--glibc--stable-2022.03-1/bin
目录下,将该目录配置到 PATH 环境变量,让系统能够正确搜索到。同时在配置 CC,CXX,CPP 与 LD 环境变量时指定 --sysroot=<dir>
参数让交叉编译器搜索 dir 目录下的头文件与库文件,而不是 /usr/include
及 /usr/lib
。
source aarch64-environment-setup
mkdir build
cd build
cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_CJSON_TEST=Off -DCMAKE_INSTALL_PREFIX=/usr
make
make DESTDIR=$BUILDSYSROOT install
- 在源码目录下创建环境设置文件并调用
source
命令让环境变量生效 - 创建临时构建目录
build
,避免在源码目录产生编译中间文件 - 切换到
build
目录 - 执行
cmake
命令,同时按照 README.md 文档说明配置 ENABLE_CJSON_UTILS 与 ENABLE_CJSON_TEST 参数的值,并指定 CMAKE_INSTALL_PREFIX 安装路径 - 执行
make
命令编译源码 - 使用 DESTDIR 参数作为安装目标文件的前缀变量,后面带上你希望安装到的文件夹路径,在本示例中,BUILDSYSROOT 指的是交叉编译工具链的 sysroot 目录,此环境变量在
aarch64-environment-setup
中已定义。更详细介绍可以参考 DESTDIR 官方介绍,也可以参考我的博文《交叉编译 libcap》关于 DESTDIR 的用法说明。
最终你就可以在 $BUILDSYSROOT/usr
文件夹中找到交叉编译好的 cJSON 的头文件及库文件。Good luck.
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景
△ \triangle △ 交叉编译 SQLite