如何在交叉编译链中链接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 CC=/opt/toolchain/toolchain-4.5.1-farsight/bin/arm-none-linux-gnueabi-gcc --enable-shared=yes --enable-static=no --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu

 

make

 

make install

执行完以上命令后,在当前路径会新建一个 tmp 目录,将 tmp 目录的 include 和 lib 目录的所有文件按照目录层次结构拷贝到工具链目录下的 include 和 lib 中。然后使用交叉编译器即可编译使用了json库的项目。

我们需要指定安装目录,利用–prefix选项,这里我们将安装路径指定为本目录下的tmp目录(默认一般为/lusr/local目录),当make install 的时候,编译好的库和include头文件就会被拷贝到这个目录下。其次,我们指定CC环境变量,编译的时候会利用CC所指定的编译器进行编译,这里我们指定CC为我们所需要使用的toolchain的gcc编译器(也可以直接用export设置CC的环境变量值,同样也可以设置CFLAGS等环境变量)。因为我们要编译为动态库,所以指定enable-shared,disable static,另外,需要指定host和build,解释如下 
–build= 谁在这里编译? 意思说你目前的编译动作在哪里跑的 ? 我们的编译动作是在pc上进行的,所以 –build=x86-pc-linux-gnu 
–host= 目前编译出来的程序在哪里跑 ? 所以json库编译好了以后是在arm上跑的,所以host设置为arm。 
–target=为谁编译程序,这在交叉编译的时候跟host一个意思,一般是guess的,而且configure 脚本会说是 =–host,所以这里我们没有指定,利用默认值。 
关于configure的选项介绍,可以参考./configure –help来查看 

 

以下是编译项目出现的一些问题:

  • 报错 /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 更新到 交叉工具链中。

 

 

你可能感兴趣的:(嵌入式)