如何解决“重定位被截断以适应:R_X86_64_PC32对未定义的符号`xmlStrcmp'”

时间:2017-01-18 14:23:34

标签: c++ libxml2

我正在尝试在C ++中使用libxml2库,但是我遇到了一些我不知道如何解决的错误。我的代码是库的基本示例。

#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/Users/robin/Documents/NetBeansProjects/xml/main.cpp:26 :(文本+ 0x36):   重定位被截断以适合:R_X86_64_PC32对未定义的符号   `xmlStrcmp'

     

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:27:   未定义的对“xmlNodeListGetString”的引用

     。

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:27 :(文本+ 0×59):   重定位被截断以适合:R_X86_64_PC32对未定义的符号   `xmlNodeListGetString'

     

build / Debug / 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 :(文本+写入0xAD):   重定位被截断以适合:R_X86_64_PC32对未定义的符号   `xmlParseFile'

     

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:49:   未定义的对“xmlDocGetRootElement”的引用

     。

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:49 :(文本+ 0xec):   重定位被截断以适合: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 :(文本+ 0x126):   重定位被截断以适合:R_X86_64_PC32对未定义的符号   `xmlFreeDoc释放'

     

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:57:   对`xmlStrcmp'的未定义引用

     。

/cygdrive/c/Users/robin/Documents/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 :(文本+ 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 :(文本+ 0x1d9):   重定位被截断以适合:R_X86_64_PC32对未定义的符号   `xmlFreeDoc释放'

     

建立/调试/ Cygwin的-视窗/ 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.7z iconv-1.14-win32-x86_64.7z 。我希望你能帮助我,谢谢你。

2 个答案:

答案 0 :(得分:2)

你是如何安装库的?

我几天前用Curl遇到了同样的问题,经过几个小时的谷歌搜索和挖掘网络的每个角落找到解决方案(因为我还是一个新手),我终于找到了它。

对我有用的解决方案可能不适合你,但是按照以下步骤尝试一下仍值得:

  • 尝试将您的库构建为静态库,而不是将其包含在内(Google会帮助您解决此问题,但它就像./configuremake一样简单)
  • 确保程序可以使用该库而不包括它(-v标志可以帮助)
  • 添加编译器选项-llibname(例如-llibxml)。此选项Search the library named libname when linking.
  • 尝试像往常一样编译并运行程序。

Goodluck!

答案 1 :(得分:0)

看起来您正在为您的C ++项目使用Netbeans IDE。我遇到了类似的问题,我通过

解决了这个问题
Right clicking on Project ==> Properties ==> Linker ==> Compilation Line ==> Additional Options ==> -llibxml 

当我使用Mac OS时,我在

下有-llibxml
C++ compiler ==> Compilation Line ==> Additional Options

在Mac OS中有效但不在Windows中。正如Daniel D.建议的那样,因为--llibxml必须在执行命令结束时。把它放在Linker帮助我