交叉编译libxml2

交叉编译libxml2

  硬件平台全志r528.

下载libxml2源码:

  https://blog.csdn.net/c1194758555/article/details/73888960

配置:

./configure --prefix=$PWD/build \
--host=arm-openwrt-linux-gnueabi \
CC=arm-openwrt-linux-gnueabi-gcc CXX=arm-openwrt-linux-gnueabi-g++

 make 

  

报错:

  /home/kerson/tina-r528/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-glibc/toolchain/bin/../

lib/gcc/arm-openwrt-linux-gnueabi/6.4.1/../../../../arm-openwrt-linux-gnueabi/bin/ld: cannot find -lz

以上问题是需要配置libz 依赖库。

后来网上查到可以 --with-python --with-zlib 如果需要包含python和zlib功能就需要编译到里面。如果不需要就

可以--without-zlib --without-zlib 就不带这个两个依赖。

zlib需要交叉编译出来。是Python交叉编译后生成文件的路径,但是下载的libxml2源码中已经绑定了python的源码,直接指向该路径即可

修改配置文件:

./configure --prefix=$PWD/build \
--host=arm-openwrt-linux-gnueabi \
CC=arm-openwrt-linux-gnueabi-gcc \
CXX=arm-openwrt-linux-gnueabi-g++ \
--without-zlib \
--with-python=$PWD/python

make

make install

 

在build目录下就是生成的库和头文件了。

如果觉得生成的库文件太大。

可以执行arm-openwrt-linux-gnueabi-strip --strip-debug XXXXX 瘦身

 

网上参考一个示例代码test.c,交叉编译进行测试

#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int main()
{
  xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");  //定义文档和节点指针

  xmlNodePtr root_node = xmlNewNode(NULL,BAD_CAST "root");
  xmlDocSetRootElement(doc,root_node);        //设置根节点

  //在根节点中直接建立节点
  xmlNewTextChild(root_node, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content");
  xmlNewTextChild(root_node, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content");
  xmlNewTextChild(root_node, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");

  //建立一个节点,设置其内容和属性,而后加入根结点
  xmlNodePtr node    = xmlNewNode(NULL,BAD_CAST "node2");
  xmlNodePtr content = xmlNewText(BAD_CAST "NODE CONTENT");
  xmlAddChild(root_node,node);
  xmlAddChild(node,content);
  xmlNewProp(node,BAD_CAST "attribute",BAD_CAST "yes");

  //建立一个儿子和孙子节点
  node = xmlNewNode(NULL, BAD_CAST "son");
  xmlAddChild(root_node,node);
  xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST "grandson");
  xmlAddChild(node,grandson);
  xmlAddChild(grandson, xmlNewText(BAD_CAST "This is a grandson node"));

  //存储xml文档
  int nRel = xmlSaveFile("CreateXml.xml",doc);
  if (nRel != -1) {
      printf("一个xml文档被建立,写入%d个字节\n", nRel);
  }
  //释放文档内节点动态申请的内存
  xmlFreeDoc(doc);
  return 1;
}

交叉编译 指定库文件和头文件

arm-openwrt-linux-gnueabi-gcc test.c -o test -I ./include/libxml2/ -L./lib -lxml2 

报错

 /home/kerson/libxml/libxml2-2.9.4/xpath.c:3167: undefined reference to `log10'
./lib/libxml2.a(xpath.o): In function `xmlXPathStringEvalNumber':
/home/kerson/libxml/libxml2-2.9.4/xpath.c:10170: undefined reference to `pow'
./lib/libxml2.a(xpath.o): In function `xmlXPathModValues':
/home/kerson/libxml/libxml2-2.9.4/xpath.c:7599: undefined reference to `fmod'
./lib/libxml2.a(xpath.o): In function `xmlXPathFloorFunction':
/home/kerson/libxml/libxml2-2.9.4/xpath.c:9667: undefined reference to `fmod'
./lib/libxml2.a(xpath.o): In function `xmlXPathCeilingFunction':
/home/kerson/libxml/libxml2-2.9.4/xpath.c:9697: undefined reference to `fmod'
./lib/libxml2.a(xpath.o): In function `xmlXPathRoundFunction':
/home/kerson/libxml/libxml2-2.9.4/xpath.c:9737: undefined reference to `fmod'
./lib/libxml2.a(xpath.o): In function `xmlXPathCompNumber':
/home/kerson/libxml/libxml2-2.9.4/xpath.c:10256: undefined reference to `pow'
./lib/libxml2.a(xmlschemastypes.o): In function `_xmlSchemaDateAdd':
/home/kerson/libxml/libxml2-2.9.4/xmlschemastypes.c:3797: undefined reference to `floor'
/home/kerson/libxml/libxml2-2.9.4/xmlschemastypes.c:3798: undefined reference to `floor'

增加-lm

arm-openwrt-linux-gnueabi-gcc test.c -o test -I ./include/libxml2/ -L./lib -lxml2 -lm

成功生成test可执行文件。

 

交叉编译zlib的方法

下载zlib源码包

https://jaist.dl.sourceforge.net/project/libpng/zlib/1.2.11/zlib-1.2.11.tar.gz

#tar zxf zlib-1.2.11.tar.gz

#cd zlib-1.2.11

因为它的configure没有交叉编译参数。所以执行

export CC=arm-openwrt-linux-gnueabi-gcc
./configure --prefix=$PWD/build

make
make install

 

报错:

Compiler error reporting is too harsh for ./configure (perhaps remove -Werror).

解决方案参考http://blog.csdn.net/hzh_beyond/article/details/40074081

在configure 删除以下字段,避免将warn处理为error :

echo "Checking for obsessive-compulsive compiler options..." >> configure.log

if try $CC -c $CFLAGS $test.c; then
:
else
echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log
leave 1
fi

 

报错1:

Failed to find a pointer-size integer type.
如果大家有遇到相似的问题,可以按照以下步骤操作

 查看configure.log 文件,查看具体的错误信息。

我的发现是交叉编译写错名字了

 

 有了这个libz的库依赖就可以再libxml中增加上了。

./configure --prefix=$PWD/build \
--host=arm-openwrt-linux-gnueabi \
CC=arm-openwrt-linux-gnueabi-gcc \
CXX=arm-openwrt-linux-gnueabi-g++ \
 --with-zlib=/home/kerson/libxml/zlib-1.2.11/build \
 --with-python=$PWD/python

make
make install

 库是编译成功了。

但是在使用的时候发现会找不到undefined reference to  gzXXX的一些文件。

我怀疑是可能zlib版本太低或这没有找到我们zlib对应的依赖库。

这个问题有时间了再进行研究。

 

 

参考:

(45条消息) libxml2交叉编译_爱学习的李冬虎的博客-CSDN博客

 

posted @ 2023-03-28 14:23  大龄小凡  阅读(444)  评论(0编辑  收藏  举报