libxml2的编译与安装

来源:互联网 发布:星际淘宝网最新章节 编辑:程序博客网 时间:2024/05/21 23:18
1. 下载和安装LIBXML2
    Libxml2是个C语言的XML程式库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,及部分的支持XSLT转换等功能。Libxml2的下载地址是
http://xmlsoft.org/
,完全版的库是开源的,并且带有例子程式和说明文件。最佳将这个库先下载下来,因为这样能查看其中的文件和例子。
由于我是在linux下用C语言进行研发的,所以我下载的是libxml2-2.6.20.tar.gz版本的源码包。
具体安装步骤:
   解压:$tar zxvf libxml2-2.6.20.tar.gz
   进入解压后的安装目录:$cd libxml2-2.6.20
   安装三部曲:1 )$./configure
                       2 )  $make
                       3 )  $make install
安装完毕。

2.libxml资料查询
     关于libxml库的相关头文件和API在这里我就不介绍了,内容太多,可以参考相关资料,进入libxml官方网站:http://xmlsoft.org/
3.一个简单程序的编译

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<libxml/xmlmemory.h>#include<libxml/parser.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")); int nRel=xmlSaveFile("CreatedXml.xml",doc); if(nRel!=-1) {   xmlFreeDoc(doc);   return 1; }}

在用libxml2尝试做解析xml文件,编译的时候出现了找不到头文件的错误:

  1. [nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c                

  2. xml-build.c:4:30: libxml/xmlmemory.h: 没有那个文件或目录  

  3. xml-build.c:5:27: libxml/parser.h: 没有那个文件或目录  

  4. xml-build.c:8: error: syntax error before "doc"

  5. xml-build.c: In function `parseStory':  

  6. xml-build.c:9: error: `xmlChar' undeclared (first use in this function)  

  7. xml-build.c:9: error: (Each undeclared identifier is reported only once  

  8. xml-build.c:9: error: for each function it appears in.)  

  9. ……  

问题出自啊c文件里的include:

  1. #include <libxml/xmlmemory.h>

  2. #include <libxml/parser.h>

默认会到/usr/include 目录下搜索,但是不存在libxml目录,而libxml是在/usr/include/libxml2/libxml 下。

所以我先做了一个软连接:

  1. [nigelzeng@myhost xml-learning]$ ln -s /usr/include/libxml2/libxml /usr/include/libxml  

再尝试着编译,路径的问题是解决了,但是链接库的问题还在,内建的函数找不到:

  1. [nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c  

  2. /tmp/cc62WqCk.o(.text+0x24): In function `parseStory':  

  3. : undefined reference to `xmlStrcmp'  

  4. /tmp/cc62WqCk.o(.text+0x3e): In function `parseStory':  

  5. : undefined reference to `xmlNodeListGetString'  

  6. /tmp/cc62WqCk.o(.text+0x62): In function `parseStory':  

  7. : undefined reference to `xmlFree'  

  8. /tmp/cc62WqCk.o(.text+0x85): In function `parseDoc':  

  9. : undefined reference to `xmlParseFile'  

  10. /tmp/cc62WqCk.o(.text+0xb7): In function `parseDoc':  

  11. : undefined reference to `xmlDocGetRootElement'  

  12. /tmp/cc62WqCk.o(.text+0xe4): In function `parseDoc':  

  13. : undefined reference to `xmlFreeDoc'  

  14. /tmp/cc62WqCk.o(.text+0xff): In function `parseDoc':  

  15. : undefined reference to `xmlStrcmp'  

  16. /tmp/cc62WqCk.o(.text+0x127): In function `parseDoc':  

  17. : undefined reference to `xmlFreeDoc'  

  18. /tmp/cc62WqCk.o(.text+0x14e): In function `parseDoc':  

  19. : undefined reference to `xmlStrcmp'  

  20. /tmp/cc62WqCk.o(.text+0x17c): In function `parseDoc':  

  21. : undefined reference to `xmlFreeDoc'  

  22. collect2: ld returned 1 exit status  

在网上搜索了下答案,可以在gcc命令后加上 -I 和 -l 参数解决:

  1. [nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c -I/usr/include/libxml2/ -lxml2  

用这个命令,所有的错误都解决了,成功编译出来需要的执行文件。

这个 -I 和 -l 的参数解释是这样的:

-Idir当用#include <file> 链接文件的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他会先在你所制定的目录查找,然后再按常规的顺序去找。

-llibrary制定编译的时候使用的库。

例子用法: gcc -lcurses hello.c   /* 使用ncurses库编译程序 */

所以“gcc -o xml-build xml-build.c -I/usr/include/libxml2/ -lxml2”命令的意思就是“在指定目录/usr/include/libxml2里寻找头文件,编译时使用的库是xml2函数库”

原创粉丝点击