2017-01-18 2 views
1

Я пытаюсь использовать библиотеку libxml2 в C++, но получаю некоторые ошибки, которые я не знаю, как их решить. Мой код является базовым примером библиотеки.Как разрешить «перемещение, усеченное, чтобы соответствовать: R_X86_64_PC32 от неопределенного символа« 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); 
} 

И я получаю эти ошибки при построении проекта.

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:26: неопределенная ссылка на `xmlStrcmp»

/cygdrive/C/Users/малиновка/Документы/NetBeansProjects /xml/main.cpp:26:(.text+0x36): перемещение усекается: R_X86_64_PC32 против неопределенного символа `xmlStrcmp»

/cygdrive/с/Users/робин/Документы/NetBeansProjects/XML/основной .cpp: 27: undefined ссылка на `xmlNodeListGetString '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:27:(.text+0x59): перемещение усекается: R_X86_64_PC32 против неопределенного символа `xmlNodeListGetString»

сборки/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:(.text+0xad): перемещение укороченный для соответствия: R_X86_64_PC32 в отношении неопределенного символа `xmlParseFile '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:49: неопределенная ссылка на `xmlDocGetRootElement»

/cygdrive/с/Пользователи/робин/Документы/NetBeansProjects/XML/главное. каст: 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:(.text+0x126): перемещение усекается: R_X86_64_PC32 против неопределенного символа `xmlFreeDoc '

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:57: неопределенной ссылки на` xmlStrcmp'

/cygdrive/с/Пользователи/робин/Документы/NetBeansProjects/XML/main.cpp: 57. :(текст + 0x142): перемещение усекается: R_X86_64_PC32 против неопределенного символа `xmlStrcmp»

/cygdrive/с/Пользователи/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: undefined Refer ENCE в `xmlFreeDoc»

/cygdrive/c/Users/robin/Documents/NetBeansProjects/xml/main.cpp:72:(.text+0x1d9): перемещения усекается: R_X86_64_PC32 против неопределенного символа `xmlFreeDoc '

сборки/Debug/Cygwin-Windows/main.o: main.cpp :(RDATA $ .refptr.xmlFree [.refptr.xmlFree] + 0x0). неопределенная ссылка на `xmlFree'

Я прочитал это сообщение What does this GCC error "... relocation truncated to fit..." mean?, но я понятия не имею, как решить мою проблему. Моя IDE - NetBeans 8.2 с Cygwin64 на 64-битной машине Windows 10. Я включил libxml2-2.9.3-win32-x86_64.7z и iconv-1.14-win32-x86_64.7z. Надеюсь, ты поможешь мне, спасибо.

+0

Возможный дубликат [Что делает эта ошибка GCC? ... усеченная в соответствии с ... »? (http://stackoverflow.com/questions/10486116/what-does- this-gcc-error-relocation-truncated-to-fit-mean) –

+0

Как я уже писал, я прочитал сообщение, но не нашел решения для своей проблемы. – rpanske

+0

Привет @rpanske! Вы нашли решение этой проблемы сейчас? Я компилирую C++-код с SQLite и Python, который отлично работал на Mac в Windows с использованием NetBeans IDE и Cygwin-компилятора. Я получаю такую ​​же ошибку – user1998463

ответ

0

Как вы установили библиотеку?

Я столкнулся с той же проблемой несколько дней назад с Curl, и после нескольких часов работы в Google и копании в каждом уголке сети, чтобы найти решение (потому что я все еще новичок), я наконец нашел его.

Решение, которое работало для меня не может работать для вас, но все же стоит дать ему попробовать, выполнив следующие действия:

  • Попробуйте построить свою библиотеку в статический вместо того, чтобы включить его (Google поможет вам в этом, но это так же просто, как ./configure и make)
  • Убедитесь, что программа может использовать библиотеку без его включения (-v флаг может помочь)
  • Добавить опцию компилятора -llibname (например -llibxml). Этот параметр Search the library named libname when linking.
  • Попробуйте скомпилировать и запустить программу, как обычно.

Goodluck!

0

Похоже, вы используете NetBeans IDE для своего проекта на C++. Я столкнулся с аналогичной проблемой, и я решил ее

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

Когда я использую Mac OS, у меня была -llibxml под

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

В Mac OS, который работал, но не в Windows. Как предположил Даниэль Д., поскольку -llibxml должен быть в конце команды выполнения.поместив его в Linker, помог мне