交叉编译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博客