libmxml (Mini-XML) arm-linux 移植笔记

libmxml (Mini-XML) arm-linux 移植笔记

20 May 2010linux

libmxml (mini-xml)

一个轻量级的xml库,可完成读写。适合系统资源受限的嵌入式设备。测试

项目主页

(http://www.minixml.org/)spa

移植过程:

首先准备好交叉编译环境。我使用的是eabi生成的arm-linux-gcc 4.3.2,位于/usr/local/arm/4.3.2/;环境变量已经设置/usr/local/arm/4.3.2/bincode

主机环境xml

  • linux-mint 8 i386
  • arm-linux-gcc 4.3.2 (eabi)
  • gcc 4.4

目标机环境资源

  • 友善之臂mini2440开发板
  • linux 2.6.31

下载源码,获得mxml-2.6.tar.gz开发

解压,进入mxmx-2.6编译器

./configure --enable-shared --host=arm-linux

make

接着make报错:源码

Testing library... 

./testmxml test.xml > temp1.xml 2 > temp1s.xml 

make: *** [testmxml] 错误   2

这是测试编译出的可执行文件是否能够正常运行时失败的结果。废话,arm-linux-gcc编译出的东西在主机上显然不能运行。编译

可是在 Testing library 以前,编译已经所有结束。咱们能够直接拿走要用的文件。

有用的文件一共 5个:

  • mxml.h 头文件
  • libmxml.a 静态连接库文件
  • libmxml.so 动态连接库的连接文件,连接到libmxml.so.1.4
  • libmxml.so.1 动态连接库的连接文件,连接到libmxml.so.1.4
  • libmxml.so.1.4 动态连接库本体

把库文件复制到交叉编译链所在位置:

我之因此没有在configure的时候直接设定prefix,是由于 eabi生成的编译链的文件结构有点诡异,头的存放目录和库文件存放目录不在一个父目录下。

mxml.h         → /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
libmxml.a      → /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib
libmxml.so     → /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib  
libmxml.so.1   → /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib  
libmxml.so.1.4 → /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib

对于其余版本的 gcc,路径极可能不同。在这里咱们应该灵活处理。

在交叉编译链所在目录中:

  • 搜索头文件最多的目录,用来存放头文件。这个目录下通常有不少子文件夹。若是不行,就在每一个有头文件存放的位置都放一个mxml.h,以保证编译器能找到该文件
  • 搜多存有.so文件的目录(通常有多个),每一个都把动态连接库和静态连接库的全部文件放进去。以保证编译器能找到。
  • 相同的文件存放在多个目录,必定保证这些文件彻底一致。即同一次编译的产物。

在库文件和头文件就位后,咱们就能够在项目中使用 libmxml 了。

使用方法:

一、添加

#include <mxml.h>

二、增长编译参数

例如

arm-linux-gcc -o test test.c -lmxml -lpthread

其中-lpthread是必选参数,由于libmxml库用到了pthread库

在编译时,编译器会优先选择动态连接库编译,这样编译出的文件会小不少。可是同时也须要目标板上有动态连接库支持。若是想静态编译,在编译参数中加上-static

为目标机添加动态连接库

  • libmxml.so
  • libmxml.so.1
  • libmxml.so.1.4

复制到目标板的库目录,通常为/lib/usr/lib

这样,动态编译的文件就能在目标板上运行了。