交叉编译 json

因为移植一个项目到RT5350的板子上,该项目源码需要用到json库,所以需要在交叉工具链上安装json库。那么首先要编译json源码,取出头文件和库文件。步骤如下:

  • 下载源码
    wget http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz

  • 交叉编译源码
    tar xvf json-c-0.9.tar.gz
    cd json-c-0.9/
    ./configure --prefix=$PWD/tmp --host=mipsel-linux --build=i686-linux
    make
    make install
    执行完以上命令后,在当前路径会新建一个 tmp 目录,将 tmp 目录的 include 和 lib 目录的所有文件按照目录层次结构拷贝到工具链目录下的 include 和 lib 中。然后使用交叉编译器即可编译使用了json库的项目。
以下是编译项目出现的一些问题:
  • 报错 /opt/MTK-SDK-gcc342/bin/../lib/gcc/mipsel-linux-uclibc/3.4.2/../../../../mipsel-linux-uclibc/bin/ld: cannot find -ljson-c
    collect2: ld returned 1 exit status
    大概的解决方法有,加 -l  -L 参数。(使用 openwrt 的menuconfig 制作的工具链,内含json库,是-ljson-c,而自己制作的是-ljson,对于这点,查看交叉工具链下的lib目录中对应库名)


  • 报错 put_log.c:9: error: parse error before "timestamp"
    使用 gcc  和其他的交叉编译器没有出现过这个错误。(这里的原因是没有包含头文件。。。。。没啥好说的。。之前没有报错,估计是编译器做了优化)


  • 报错 ndefined reference to `rpl_malloc'
    ndefined reference to `rpl_realloc'
    个人感觉这个错误很郁闷。(经过一些查找,发现是交叉编译时,autotools 认为我的工具链的 libc 中不包含 malloc 和 realloc。然后擅自做主张给我替换成了rpl_malloc和rpl_realloc。)
    我的解决方法是:删除 config.h 文件中 #define HAVE_MALLOC 1 和 #define HAVE_REALLOC 1 。然后重新 make , make install , 然后将工作目录下的 tmp 目录中的 include 和 lib 更新到 交叉工具链中。

### 在 ARM 平台上交叉编译 nlohmann/json 库 nlohmann/json 是一个纯头文件的 C++ JSON 解析库,因此其使用并不需要传统的交叉编译流程。以下是针对 ARM 平台的具体说明和操作步骤: #### 纯头文件库的特点 由于 nlohmann/json 是纯头文件库,无需单独编译或生成二进制文件。只需将头文件集成到项目中即可使用[^2]。 #### 获取头文件 可以通过以下方式获取 nlohmann/json 的头文件: - **从 GitHub 下载**:访问 [nlohmann/json 的官方仓库](https://github.com/nlohmann/json),下载 `single_include` 文件夹中的内容。 - **克隆指定版本**:如果需要特定版本的库,可以使用 Git 克隆命令,例如: ```bash git clone --branch v3.10.5 https://github.com/nlohmann/json.git ``` 其中 `v3.10.5` 是目标版本号,可以根据需求调整[^1]。 #### 配置交叉编译环境 在交叉编译环境中,确保以下条件满足: - 使用适当的工具链(如 `aarch64-linux-gnu-g++`)进行编译。 - 将 nlohmann/json 的头文件路径添加到项目的包含路径中。 例如,在 Makefile 中配置如下: ```makefile CXX = aarch64-linux-gnu-g++ CXXFLAGS = -std=c++17 -I/path/to/json/single_include LDFLAGS = -L/path/to/libs TARGET = my_program SOURCES = main.cpp all: $(TARGET) $(TARGET): $(SOURCES) $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) ``` #### 示例代码 以下是一个简单的示例代码,展示如何在 ARM 平台上使用 nlohmann/json: ```cpp #include <iostream> #include <nlohmann/json.hpp> using json = nlohmann::json; int main() { // 创建一个 JSON 对象 json j; j["name"] = "ARM Platform"; j["architecture"] = "ARM64"; // 打印 JSON 字符串 std::cout << j.dump(4) << std::endl; return 0; } ``` #### 编译与运行 在主机上使用交叉编译工具链编译上述代码。假设工具链为 `aarch64-linux-gnu-g++`,命令如下: ```bash aarch64-linux-gnu-g++ -std=c++17 -I/path/to/json/single_include main.cpp -o main ``` 将生成的二进制文件传输到 ARM 设备上运行。 #### 注意事项 - 确保目标 ARM 系统支持 C++17 或更高版本的标准[^2]。 - 如果项目依赖其他库(如 protobuf),需确保这些库已正确交叉编译并链接[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值