2017-01-18 1 views
1

Ich versuche, die Bibliothek libxml2 in C++ zu verwenden, aber ich bekomme einige Fehler, die ich nicht zu lösen weiß. Mein Code ist ein grundlegendes Beispiel für die Bibliothek.So lösen Sie "Verschiebung abgeschnitten, um zu passen: R_X86_64_PC32 gegen undefiniertes Symbol` xmlStrcmp '"

#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); 
} 

Und ich bekomme diese Fehler beim Erstellen des Projekts.

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:26: undefined reference to `xmlStrcmp‘

/cygdrive/c/Users/Robin/Dokumente/NetBeansProjects /xml/main.cpp:26:(.text+0x36): Verlagerung abgeschnitten passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlStrcmp‘

/cygdrive/c/Benutzer/robin/Dokumente/NetBeansProjects/xml/main .cpp: 27: undefinierter Verweis auf `xmlNodeListGetString '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:27:(.text+0x59): Verlagerung abgeschnitten zu passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlNodeListGetString‘

build/Debug/Cygwin-Fenster/main.o: In Funktion 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): Umzug abgeschnitten, um zu passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlParseFile '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:49: undefined reference to `xmlDocGetRootElement‘

/cygdrive/c/Users/Robin/Dokumente/NetBeansProjects/xml/main. CPP: 49 :(text + 0xec.): Verlagerung abgeschnitten zu passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlDocGetRootElement‘

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:53: undefined reference to `xmlFreeDoc‘

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:53:(.text+0x126): Relocation abgeschnitten zu passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlFreeDoc '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:57: undefinierte Bezugnahme auf` xmlStrcmp'

/cygdrive/c/Benutzer/robin/Dokumente/NetBeansProjects/xml/main.cpp. 57 :(text + 0x142): Verlagerung abgeschnitten passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlStrcmp‘

/cygdrive/c/Benutzer/robin/Documents/NetBeansProjects/xml/main.cpp: 59: undefinierter Verweis auf `xmlFreeDoc '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:59 :(.text + 0x17a): Verlagerung abgeschnitten zu passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlFreeDoc‘

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:65: undefinierte Bezugnahme auf `xmlStrcmp '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:65:(.text+0x1a6): Verlagerung abgeschnitten passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlStrcmp'

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:72: undefined beziehen Ence zu `xmlFreeDoc‘

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:72:(.text+0x1d9): Verlagerung abgeschnitten passen: R_X86_64_PC32 gegen undefiniertes Symbol `xmlFreeDoc '

build/Debug/Cygwin-Fenster/main.o: main.cpp :(rdata $ .refptr.xmlFree [.refptr.xmlFree] + 0x0.): undefined reference to `xmlFree'

Ich habe diesen Beitrag What does this GCC error "... relocation truncated to fit..." mean? gelesen, aber ich habe keine Ahnung, wie ich mein Problem lösen kann. Meine IDE ist Netbeans 8.2 mit Cygwin64 auf einer Windows 10 64 Bit Maschine. Ich habe libxml2-2.9.3-win32-x86_64.7z und iconv-1.14-win32-x86_64.7z enthalten. Ich hoffe du kannst mir helfen, danke.

+0

Mögliche Duplikat von [Was bedeutet dieser GCC-Fehler "... Verlagerung abgeschnitten zu passen ..." bedeuten?] (http://stackoverflow.com/questions/10486116/what-does- this-gcc-error-relocation-truncated-to-fit-mean) –

+0

Wie ich geschrieben habe, habe ich den Beitrag gelesen, aber keine Lösung für mein Problem gefunden. – rpanske

+0

Hallo @rpanske! Haben Sie jetzt eine Lösung für dieses Problem gefunden? Ich kompiliere C++ - Code mit SQLite und Python, die früher in Mac in Windows mit Netbeans IDE und Cygwin-Compiler funktionierten. Ich bekomme denselben Fehler – user1998463

Antwort

0

Wie haben Sie die Bibliothek installiert?

Ich stieß auf das gleiche Problem vor ein paar Tagen mit Curl, und nach stundenlangen Googeln und Graben jede Ecke des Internets, um eine Lösung zu finden (weil ich immer noch ein newbit bin), fand ich endlich.

Die Lösung, die für mich gearbeitet möglicherweise nicht für Sie arbeiten, aber es lohnt sich immer noch eine Chance zu geben, diesen Schritten folgt:

  • Ihre Bibliothek in einen statischen zu bauen, anstatt es zu einschließlich (Google wird Ihnen dabei helfen, aber es ist so einfach wie ./configure und make)
  • Stellen Sie sicher, das Programm die Bibliothek ohne einschließlich verwenden können (-v Flagge helfen kann)
  • eine Compiler-Option hinzufügen -llibname (zB -llibxml). Diese Option Search the library named libname when linking.
  • Versuchen Sie, das Programm wie üblich zu kompilieren und auszuführen.

Goodluck!

0

Sieht aus wie Sie Netbeans IDE für Ihr C++ Projekt verwenden. Ich ähnliches Problem konfrontiert, und ich löste es durch

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

Als ich Mac OS benutzte, hatte ich -llibxml unter

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

In Mac OS, das funktioniert aber nicht in Windows. Wie Daniel D. vorgeschlagen, da --llibxml muss am Ende der Ausführung Befehl sein.Platzierung in Linker half mir

Verwandte Themen