3步搞定cJSON交叉编译:ARM嵌入式JSON库实战指南
【免费下载链接】cJSON Ultralightweight JSON parser in ANSI C 项目地址: https://gitcode.com/gh_mirrors/cj/cJSON
你还在为嵌入式设备上JSON解析库体积过大、编译报错而烦恼?本文将带你3步完成cJSON库的ARM平台交叉编译,生成仅占30KB的超轻量级JSON解析库,完美适配资源受限的嵌入式环境。读完本文你将掌握:
- 交叉编译工具链配置技巧
- Makefile与CMake双方案实现
- 编译结果验证与问题排查
- 嵌入式项目集成最佳实践
为什么选择cJSON?
cJSON是一个用ANSI C编写的超轻量级JSON解析库(cJSON.h),具有以下优势:
交叉编译准备工作
工具链安装
首先需要安装ARM交叉编译工具链,以Ubuntu系统为例:
sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf
验证工具链是否安装成功:
arm-linux-gnueabihf-gcc -v
获取源码
从国内镜像仓库克隆cJSON源码:
git clone https://gitcode.com/gh_mirrors/cj/cJSON
cd cJSON
方案一:Makefile交叉编译
修改编译参数
cJSON提供了完善的Makefile构建系统(Makefile),通过命令行参数指定交叉编译器:
make CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib
关键参数说明:
CC:指定C编译器为ARM版本AR:指定静态库打包工具RANLIB:指定静态库索引工具
编译静态库
执行以下命令编译静态库:
make static CC=arm-linux-gnueabihf-gcc AR=arm-linux-gnueabihf-ar
编译成功后会生成:
libcjson.a:cJSON核心库libcjson_utils.a:扩展工具库(需开启ENABLE_CJSON_UTILS)
清理编译产物
make clean
方案二:CMake交叉编译
创建工具链文件
在项目根目录创建arm-toolchain.cmake文件:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
配置编译选项
使用CMake生成Makefile,指定工具链文件和安装路径:
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../arm-toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=/tmp/cjson-arm \
-DBUILD_SHARED_LIBS=OFF \
-DENABLE_CJSON_UTILS=ON
关键CMake选项说明:
CMAKE_TOOLCHAIN_FILE:指定交叉编译工具链配置CMAKE_INSTALL_PREFIX:指定安装路径BUILD_SHARED_LIBS:设为OFF编译静态库ENABLE_CJSON_UTILS:设为ON编译工具库
执行编译安装
make -j4
make install
编译产物会安装到/tmp/cjson-arm目录,包含:
- 头文件:
include/cjson/cJSON.h和include/cjson/cJSON_Utils.h - 静态库:
lib/libcjson.a和lib/libcjson_utils.a
编译结果验证
检查文件类型
使用file命令验证生成的库文件是否为ARM架构:
file libcjson.a
预期输出应包含:ARM, EABI5 version 1 (GNU)
嵌入式项目集成测试
创建测试文件test_arm.c:
#include <cJSON.h>
#include <stdio.h>
int main() {
cJSON *root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "name", "cJSON");
cJSON_AddNumberToObject(root, "version", 1.7);
char *json_str = cJSON_Print(root);
printf("JSON: %s\n", json_str);
cJSON_Delete(root);
free(json_str);
return 0;
}
交叉编译测试程序:
arm-linux-gnueabihf-gcc test_arm.c -o test_arm -I/tmp/cjson-arm/include/cjson -L/tmp/cjson-arm/lib -lcjson -lm
常见问题解决方案
编译报错:undefined reference to `localeconv'
修改CMakeLists.txt,禁用 locales 支持:
option(ENABLE_LOCALES "Enable the use of locales" OFF)
或在Makefile中添加编译选项:
make CFLAGS=-DENABLE_LOCALES=0
静态库体积优化
通过strip命令减小库体积:
arm-linux-gnueabihf-strip --strip-unneeded libcjson.a
总结与展望
本文详细介绍了两种cJSON交叉编译方案,Makefile适合快速构建,CMake适合复杂项目集成。编译后的cJSON库可广泛应用于ARM嵌入式设备,如物联网网关、工业控制器等场景。
下期预告:cJSON在嵌入式系统中的内存优化技巧,敬请关注!
如果本文对你有帮助,欢迎点赞、收藏、关注三连支持!
【免费下载链接】cJSON Ultralightweight JSON parser in ANSI C 项目地址: https://gitcode.com/gh_mirrors/cj/cJSON
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



