C言語解析xmlファイルで発生したコンパイル問題


libxml 2でxmlファイルの解析を試みたところ、コンパイル中にヘッダファイルが見つからないエラーが発生しました.
 
[nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c               
xml-build.c:4:30: libxml/xmlmemory.h:          
xml-build.c:5:27: libxml/parser.h:          
xml-build.c:8: error: syntax error before "doc"
xml-build.c: In function `parseStory':
xml-build.c:9: error: `xmlChar' undeclared (first use in this function)
xml-build.c:9: error: (Each undeclared identifier is reported only once
xml-build.c:9: error: for each function it appears in.)
……

 
 
問題はcファイルのincludeから出ています.
 
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

 
 
デフォルトでは/usr/includeディレクトリで検索されますが、libxmlディレクトリは存在しません.libxmlは/usr/include/libxml 2/libxmlです.
まずソフト接続をしました
 
[nigelzeng@myhost xml-learning]$ ln -s /usr/include/libxml2/libxml /usr/include/libxml

 
 
もう一度コンパイルしてみると、パスの問題は解決しましたが、リンクライブラリの問題はまだあり、内蔵の関数は見つかりません.
 
[nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c
/tmp/cc62WqCk.o(.text+0x24): In function `parseStory':
: undefined reference to `xmlStrcmp'
/tmp/cc62WqCk.o(.text+0x3e): In function `parseStory':
: undefined reference to `xmlNodeListGetString'
/tmp/cc62WqCk.o(.text+0x62): In function `parseStory':
: undefined reference to `xmlFree'
/tmp/cc62WqCk.o(.text+0x85): In function `parseDoc':
: undefined reference to `xmlParseFile'
/tmp/cc62WqCk.o(.text+0xb7): In function `parseDoc':
: undefined reference to `xmlDocGetRootElement'
/tmp/cc62WqCk.o(.text+0xe4): In function `parseDoc':
: undefined reference to `xmlFreeDoc'
/tmp/cc62WqCk.o(.text+0xff): In function `parseDoc':
: undefined reference to `xmlStrcmp'
/tmp/cc62WqCk.o(.text+0x127): In function `parseDoc':
: undefined reference to `xmlFreeDoc'
/tmp/cc62WqCk.o(.text+0x14e): In function `parseDoc':
: undefined reference to `xmlStrcmp'
/tmp/cc62WqCk.o(.text+0x17c): In function `parseDoc':
: undefined reference to `xmlFreeDoc'
collect2: ld returned 1 exit status

 
 
ネット上で答えを検索して、gccコマンドの後に-Iと-lパラメータを加えて解決することができます:
 
[nigelzeng@myhost xml-learning]$ gcc -o xml-build xml-build.c -I/usr/include/libxml2/ -lxml2

 
 
このコマンドで、すべてのエラーが解決し、必要な実行ファイルのコンパイルに成功しました.
 
この−Iと−lのパラメータは次のように解釈される.

-idir#includeでファイルをリンクすると、gcc/g++は現在のディレクトリで作成したヘッダファイルを検索し、見つからない場合はデフォルトのヘッダファイルディレクトリに戻り、-Iを使用してディレクトリを作成すると、作成したディレクトリを検索してから、通常の順序で探します.
 
-llibraryがコンパイル時に使用するライブラリを作成します.
例用法:gcc-lcurses hello.c/*ncursesライブラリコンパイラを使用*/

 
したがって、「gcc-o xml-build xml-build.c-I/usr/include/libxml 2/-lxml 2」コマンドは、「指定ディレクトリ/usr/include/libxml 2でヘッダファイルを探し、コンパイル時に使用するライブラリはxml 2関数ライブラリ」を意味します.
 
 
ps:
このコマンドは、gcc`xml 2-config--cflags--libs`-o xml-create xml-create.c