x86_64 GNU/Linux下编译32位cJSON

本帖记录Ubuntu16.04 64体系结构下编译32位cJSON的方法

背景:编译mosquitto需要。
解决方案:通过cJSON的源码编译出32位的库。

步骤1:修改CMakeList.txt,增加-m32标志。
set(CMAKE_C_FLAGS “-m32”)
set(CMAKE_CXX_FLAGS “-m32”)
在这里插入图片描述

步骤2:执行cmake。
cmake -DCMAKE_INSTALL_PREFIX=output32

步骤3:执行make。
步骤4:执行make install。

最终结果:
在这里插入图片描述

### cJSON 在 Windows 上的交叉编译教程 要在 Windows 环境下对 `cJSON` 进行交叉编译,可以按照以下方式操作。以下是基于 CMake 的交叉编译流程说明。 #### 准备工作 1. 安装所需的工具链: 需要安装适合目标平台(如 ARM-Linux)的 GCC 工具链。可以从 Linaro 或其他可信源下载预构建的工具链二进制文件[^2]。 2. 下载并解压 `cJSON` 源码包: 可以从官方 GitHub 仓库获取最新版本的 `cJSON` 源码。 3. 安装 CMake 和 Ninja 构建工具: 推荐使用较新版本的 CMake (>=3.16),以及 Ninja 来加速构建过程。 --- #### 设置交叉编译环境变量 在 Windows 中设置交叉编译器路径到系统的 PATH 环境变量中。假设工具链于如下目录: ```plaintext C:\tools\gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu\bin\ ``` 将该路径添加至系统 PATH 中,或者通过命令行临时指定: ```cmd set PATH=C:\tools\gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu\bin;%PATH% ``` 验证工具链是否可用: ```cmd aarch64-linux-gnu-gcc --version ``` 如果显示版本号,则表示成功配置了工具链。 --- #### 使用 CMake 配置交叉编译选项 创建一个新的输出目录用于存储生成的目标文件和中间产物: ```cmd mkdir build && cd build ``` 运行 CMake 命令来配置项目,并传递必要的参数: ```cmd cmake .. ^ -DCMAKE_SYSTEM_NAME=Linux ^ -DCMAKE_SYSTEM_PROCESSOR=aarch64 ^ -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc ^ -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ ^ -DCMAKE_FIND_ROOT_PATH=C:/path/to/sysroot ^ -DCMAKE_INSTALL_PREFIX=C:/output/path ``` 解释上述参数的意义: - `-DCMAKE_SYSTEM_NAME`: 指定目标操作系统名称为 Linux。 - `-DCMAKE_SYSTEM_PROCESSOR`: 指定目标处理器架构为 aarch64。 - `-DCMAKE_C_COMPILER`, `-DCMAKE_CXX_COMPILER`: 显式指定了交叉编译器路径。 - `-DCMAKE_FIND_ROOT_PATH`: 如果有特定的 sysroot 路径,请在此处提供。 - `-DCMAKE_INSTALL_PREFIX`: 指定最终安装置。 完成配置后,执行实际构建: ```cmd cmake --build . --config Release --target install ``` 这会触发构建过程并将结果安装到指定的前缀目录中。 --- #### 解决常见问题 1. **找不到头文件或库文件**: 如果出现类似错误提示无法找到某些依赖项,可能是因为未正确设置 `CMAKE_FIND_ROOT_PATH` 参数。确保此路径指向包含目标平台所需的所有头文件和库的置。 2. **链接阶段失败**: 当遇到动态链接库缺失的情况时,在链接阶段需显式加入库路径。例如: ```cmd cmake .. -DLINK_FLAGS="-L/usr/local/json-c-0.9forarm/lib/" ``` 3. **缺少 sysroot 支持**: 对于一些复杂的场景,建议准备完整的 sysroot 文件夹结构,其中应包含标准 C/C++ 库及其对应的调试符号表。 --- #### 示例代码片段 下面是一个简单的测试程序,展示如何加载已编译好的 `cJSON` 功能模块: ```c #include "cjson/cJSON.h" int main() { const char *json_string = "{\"name\":\"John\", \"age\":30}"; cJSON *root = cJSON_Parse(json_string); if (!root) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return 1; } cJSON *name = cJSON_GetObjectItemCaseSensitive(root, "name"); cJSON *age = cJSON_GetObjectItemCaseInsensitive(root, "age"); if (cJSON_IsString(name) && name->valuestring != NULL && cJSON_IsNumber(age)) { printf("Name: %s\nAge: %d\n", name->valuestring, age->valueint); } cJSON_Delete(root); return 0; } ``` 编译此代码时可参考以下指令: ```cmd aarch64-linux-gnu-gcc test.c -o test -I<path_to_cjson_include> -L<path_to_cjson_lib> -lcjson ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值