json-c的交叉编译

  • Post author:
  • Post category:其他


第一次学习交叉编译,从最简单的json-c的开源库开始,json-c开源库是一个用c实现的解析json字段的库,可以从github上获取,我另一篇博客专门对这个库有介绍,此篇主要记录对json-c进行交叉编译到arm开发板上。我下载的是Json-c的4.0版本。

1.cd到json-c的目录 里面有一个autogen.sh的脚本,首先要运行这个脚本来产生configure文件。运行完这个脚本后,我们就会发现在该目录下产生了configure文件。

2

./configure --prefix=$PWD/tmp CC=/usr/local/linaro-armv7ahf-2016.08-gcc6.1/bin/arm-kinux-gnueabihf-gcc --enable-shared=yes --enable-static=no --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu

首先,我们需要指定安装目录,利用

--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 脚本会说是

target = host

,所以这里我们没有指定,利用默认值。

关于configure的选项介绍,可以参考

./configure --help

来查看

3.make 调用make命令进行编译

4.make install 会根据指定的安装路径将Include文件夹头文件和lib拷贝到安装路径。我们这时就会发现在tmp目录下有include目录和lib目录。

5.我们将编译好的include头文件目录和lib目录拷贝到需要的地方,比如third-party下json-c目录,一个include目录为头文件,一个lib目录放.so库。有程序要调用该库时,需要包含include中的头文件,并在makefile中利用

-I

指定头文件所在的路径(比如third-party目录下的路径),

-L

指定库的路径,用

-l

指定所要链接的库。当需要在arm嵌入式设备上调用该库时,就把这个库拷贝到arm设备的/usr/lib目录下。

6.我们可以用该toolchain中的工具来查看编译好的程序的链接关系,比如利用objdump工具来查看NEEDED字段,如下

/usr/local/linaro-armv7ahf-2016.08-gcc6.1/bin/arm-linux-gnueabihf-objdump -p test_json_parser | grep NEEDED

就可以看到这个test程序所需要的动态库,里面就包含libjson-c.so库。



版权声明:本文为langzijing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。