libxml2的編譯與安裝

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函數庫”


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章