Ошибка при связывании libxml2

#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. (Сбой …)