我正在尝试在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 。我希望你能帮助我,谢谢你。
答案 0 :(得分:2)
你是如何安装库的?
我几天前用Curl遇到了同样的问题,经过几个小时的谷歌搜索和挖掘网络的每个角落找到解决方案(因为我还是一个新手),我终于找到了它。
对我有用的解决方案可能不适合你,但是按照以下步骤尝试一下仍值得:
./configure
和make
一样简单)-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时,我在
下有-llibxmlC++ compiler ==> Compilation Line ==> Additional Options
在Mac OS中有效但不在Windows中。正如Daniel D.建议的那样,因为--llibxml必须在执行命令结束时。把它放在Linker帮助我