#c #linker #libxml2
#c #компоновщик #libxml2
Вопрос:
У меня есть простой пример для libxml2, но он возвращает следующую ошибку:
$ gcc -Wall -lxml2 -I/usr/include/libxml2 -o ex1 ex1.c
/tmp/cc6OKSKJ.o: In function `main':
ex1.c:(.text 0x60): undefined reference to `xmlReadFile'
ex1.c:(.text 0x70): undefined reference to `xmlDocGetRootElement'
collect2: ld returned 1 exit status
$ xml2-config --libs
-lxml2
$ xml2-config --cflags
-I/usr/include/libxml2
Я использую Lubuntu 11.10 x86_64, и у меня есть все пакеты, которые мне нужны (ну, я думаю): libxml2, libxml2-dev, libxml2-dbg… Вот код примера:
// gcc -Wall -lxml2 -I/usr/include/libxml2 -o ex1 ex1.c
#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
int main(int argc, char **argv)
{
xmlDoc *document;
xmlNode *root, *first_child, *node;
char *filename;
if (argc < 2)
{
fprintf(stderr, "Usage: %s filename.xmln", argv[0]);
return 1;
}
filename = argv[1];
document = xmlReadFile(filename, NULL, 0);
root = xmlDocGetRootElement(document);
fprintf(stdout, "Root is <%s> (%i)n", root->name, root->type);
first_child = root->children;
for (node = first_child; node; node = node->next)
{
fprintf(stdout, "t Child is <%s> (%i)n", node->name, node->type);
}
fprintf(stdout, "...n");
return 0;
}
Комментарии:
1. Убедитесь, что gcc компилируется для той же архитектуры, что и библиотеки libxml2, которые вы используете (в частности, убедитесь, что одна из них не является x86_64, а другая i386). Кажется маловероятным, что это может быть причиной, но ее стоит проверить.
Ответ №1:
Ваша строка ссылки неверна. Попробуйте
gcc -Wall -I/usr/include/libxml2 -o ex1 ex1.c -lxml2
Прочтите это, чтобы понять, почему порядок источников и библиотек в командной строке имеет значение.
Комментарии:
1. Как вы думаете, для разделяемых библиотек порядок будет иметь значение? В ссылке обсуждается вопрос о статических библиотеках. Я могу скомпилировать его на Ubuntu 10.04 (32 бит) без каких-либо проблем, с которыми пытается справиться OP, и есть только одна библиотека «libxml», Которая связана (кроме стандартных, таких как libc, ld и т. Д. ofc)
2. Я никогда не мог себе представить, что порядок имеет значение, но да, для меня он работает только с -lxml2 в конце.
3. вместо -I/usr/include/libxml2 используйте $(xml2-config —cflags)
4. Не работает для кросс-компиляции для этого. Отлично работает с компиляцией хоста, но когда вы делаете это с целью, он останавливается на ссылке, не может легко справиться с порядком ссылок, потому что все это автоматически с помощью Autotools. (Сбой …)