2017-01-18 4 views
1

C++でlibxml2ライブラリを使用しようとしていますが、解決方法がわからないエラーが発生します。私のコードは、ライブラリの基本的な例です。どのように解決するには: "未知のシンボル` xmlStrcmp 'に対してR_X86_64_PC32を切り詰める再配置:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <libxml/xmlmemory.h> 
#include <libxml/parser.h> 

void 
parseStory (xmlDocPtr doc, xmlNodePtr cur) { 

    xmlChar *key; 
    cur = cur->xmlChildrenNode; 
    while (cur != NULL) { 
     if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) { 
      key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1); 
      printf("keyword: %s\n", key); 
      xmlFree(key); 
     } 
    cur = cur->next; 
    } 
    return; 
} 

static void 
parseDoc(char *docname) { 

    xmlDocPtr doc; 
    xmlNodePtr cur; 

    doc = xmlParseFile(docname); 

    if (doc == NULL) { 
     fprintf(stderr,"Document not parsed successfully. \n"); 
     return; 
    } 

    cur = xmlDocGetRootElement(doc); 

    if (cur == NULL) { 
     fprintf(stderr,"empty document\n"); 
     xmlFreeDoc(doc); 
     return; 
    } 

    if (xmlStrcmp(cur->name, (const xmlChar *) "story")) { 
     fprintf(stderr,"document of the wrong type, root node != story"); 
     xmlFreeDoc(doc); 
     return; 
    } 

    cur = cur->xmlChildrenNode; 
    while (cur != NULL) { 
     if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){ 
      parseStory (doc, cur); 
     } 

    cur = cur->next; 
    } 

    xmlFreeDoc(doc); 
    return; 
} 

int 
main(int argc, char **argv) { 

    char *docname; 

    if (argc <= 1) { 
     printf("Usage: %s docname\n", argv[0]); 
     return(0); 
    } 

    docname = argv[1]; 
    parseDoc (docname); 

    return (1); 
} 

プロジェクトを作成する際にこれらのエラーが発生します。

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:26: `xmlStrcmp」

/cygdriveの/ C /ユーザ/ロビン/ドキュメント/ NetBeansProjectsへ 未定義の参照/xml/main.cpp:26:(.text+0x36): 収まるように切り捨て移転:未定義のシンボルに対するR_X86_64_PC32 `xmlStrcmp」

/cygdriveの/ C /ユーザ/ロビン/ドキュメント/ NetBeansProjects/XML /メイン.cpp:27: `xmlNodeListGetString 'への未定義の参照

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:27:(.text+0x59): 再配置が収まるように切り捨て:R_X86_64_PC32を未定義のシンボルに対して `xmlNodeListGetString」を

ビルド/デバッグ/ Cygwinの-のWindows/main.o:機能で parseDoc': /cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:42: undefined reference to xmlParseFile」

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:42:(.text+0xad): 移転切り詰められて:未定義シンボルに対してR_X86_64_PC32 `xmlParseFile '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:49: `xmlDocGetRootElement」

/cygdriveの/ C /ユーザ/ロビン/ドキュメント/ NetBeansProjects/XML /主に未定義参照。 CPP:。+ 0xec 49 :(テキスト):収まるように切り捨て 移転:R_X86_64_PC32未定義のシンボルに対する `xmlDocGetRootElement」

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:53: `xmlFreeDoc」へ 未定義の参照

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:53:(.text+0x126): 収まるように切り捨て移転:未定義のシンボルに対するR_X86_64_PC32 `xmlFreeDoc '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:57:xmlStrcmp`へ 未定義の参照'

/cygdriveの/ C /ユーザ/ロビン/ドキュメント/ NetBeansProjects/XML/main.cppに:57 :(テキスト+ 0x142):収まるように切り捨て 移転:未定義のシンボルに対するR_X86_64_PC32 `xmlStrcmp」

/cygdriveの/ C/Users/robin/Documents/NetBeansProjects/xml/main.cpp:59: `xmlFreeDoc 'への未定義の参照

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:59 :(。テキスト+ 0x17a):収まるように切り捨て 移転:R_X86_64_PC32未定義のシンボルに対する `xmlFreeDoc」

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:65:xmlStrcmp`へ 未定義の参照'

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:65:(.text+0x1a6):収まるように切り捨て 移転:未定義のシンボルに対するR_X86_64_PC32 `xmlStrcmp'

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:72: 未定義参照)xmlFreeDoc」

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:72:(.text+0x1d9 `へレンス:収まるように切り捨て 移転:未定義のシンボルに対するR_X86_64_PC32 ` xmlFreeDoc '

ビルド/デバッグ/ Cygwinの-のWindows/main.o:main.cppに:(RDATA $ .refptr.xmlFree [.refptr.xmlFree] +は0x0):。 `xmlFreeへ 未定義の参照'

私はこのポストWhat does this GCC error "... relocation truncated to fit..." mean?を読んだことがありますが、私は問題を解決するための手がかりがありません。私のIDEは、Windows 10 64ビットマシン上のCygwin64を備えたNetbeans 8.2です。私はlibxml2-2.9.3-win32-x86_64.7ziconv-1.14-win32-x86_64.7zを含んでいます。あなたが私を助けることを願っています、ありがとう。

+0

[このGCCエラー "...再配置が収まるように切り捨てられました..."という意味の重複がありますか?](http://stackoverflow.com/questions/10486116/what-does-この-gcc-error-relocation-truncated-to-fit-mean) –

+0

私が書いたように、私は投稿を読むが、私の問題の解決策は見つけられなかった。 – rpanske

+0

こんにちは@rpanske!あなたは今この問題の解決策を見つけましたか?私はNetbeans IDEとCygwinコンパイラを使用してWindowsでMacでうまく動作していたSQLiteとPythonでC++コードをコンパイルしています。同じエラーが発生しています – user1998463

答えて

0

ライブラリをどのようにインストールしましたか?

私は数日前にCurlと同じ問題を抱えていました。私はまだ新しいものなので解決策を見つけるためにウェブのあらゆる場所をグーグルで掘り下げています。

私のために働いたソリューションは、あなたのために動作しない場合がありますが、それはまだ価値がある、それは以下の手順に従って、それを試してみることにし:それを含むのではなく、静的なものにあなたのライブラリーを構築するために

  • てみてください(Googleはこれをお届けしますが、それは./configureとし、makeなど簡単です)
  • は、(例えば、 -llibxml用)コンパイラオプション -llibnameを追加
  • -vフラグを助けることができる)プログラムは、それを含めずにライブラリを使用できることを確認します。このオプションSearch the library named libname when linking.
  • 通常どおりプログラムをコンパイルして実行してください。

Goodluck!

0

あなたのC++プロジェクトでNetbeans IDEを使用しているようです。私は同様の問題に直面し、私は、Mac OSを使用していたとき、私は

Right clicking on Project ==> Properties ==> Linker ==> Compilation Line ==> Additional Options ==> -llibxml 

ことによってそれを解決し、私が働いていたではなく、WindowsのMac OSの場合

C++ compiler ==> Compilation Line ==> Additional Options 

下-llibxmlました。 Daniel D.が示唆したように、--llibxmlは実行コマンドの最後になければならないので、リンカーに配置すると助けてくれました

関連する問題