因为移植一个项目到RT5350的板子上,该项目源码需要用到json库,所以需要在交叉工具链上安装json库。那么首先要编译json源码,取出头文件和库文件。步骤如下:
- 下载源码
wget http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz
- 交叉编译源码
执行完以上命令后,在当前路径会新建一个 tmp 目录,将 tmp 目录的 include 和 lib 目录的所有文件按照目录层次结构拷贝到工具链目录下的 include 和 lib 中。然后使用交叉编译器即可编译使用了json库的项目。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
以下是编译项目出现的一些问题:
- 报错 /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 更新到 交叉工具链中。