binutils/bfd.h хочет config.h сейчас?

Я пытаюсь использовать библиотеку BFD, поэтому я установил пакет binutils-dev и включил:

#include <bfd.h>

и я звоню bfd_openr и bfd_close и так далее из моего кода.

Недавно я обновил пакеты, и теперь я получаю сообщение об ошибке:

бфд.ч:

/* PR 14072: Ensure that config.h is included first.  */
#if !defined PACKAGE && !defined PACKAGE_VERSION
#error config.h must be included before this header
#endif

... что я должен включить config.h, но я не использую autoconf.

Я включаю неправильный заголовочный файл? Как вы собираетесь использовать binutils-dev?

Вот демонстрационная программа:

#include <stdio.h>
#include <bfd.h>

int main()
{
    bfd_init();

    bfd* file = bfd_openr("a.out", 0);

    if (!file)
        return -1;

    if (bfd_check_format(file, bfd_object))
        printf("object file\n");
    else
        printf("not object file\n");

    bfd_close(file);

    return 0;
}

попробуйте скомпилировать и запустить следующим образом:

$ sudo apt-get install binutils-dev
$ gcc test.c
In file included from test.c:3:0:
/usr/include/bfd.h:37:2: error: #error config.h must be included before this header

person Andrew Tomazos    schedule 31.07.2012    source источник
comment
Связано: sourceware.org/bugzilla/show_bug.cgi?id=14243   -  person cnicutar    schedule 01.08.2012


Ответы (1)


Что ж, самый правильный способ использования шапки — использовать autotools и в вашем пакете. Некоторые люди просто упрямы, и я не думаю, что с этим можно что-то поделать.

Альтернативой является обход проверки путем определения макросов, которые она использует:

#define PACKAGE 1
#define PACKAGE_VERSION 1

Конечно, если вы уже определили их, вы также можете установить для них некоторые разумные значения, например:

#define PACKAGE "your-program-name"
#define PACKAGE_VERSION "1.2.3"

и использовать их для своей программы. Обычно вы все равно будете использовать что-то подобное в какой-то момент, чтобы поддерживать согласованность версий.

Этого должно быть достаточно, если вы используете компилятор, соответствующий стандартам, потому что тогда будет объявлен макрос __STDC__, и все пойдет как надо. Что ж, до тех пор, пока используемые вами заголовки не потребуют дополнительных определений, сгенерированных autoconf.

Например, если вы хотите использовать plugin-api.h, вам фактически придется обрабатывать проверку для stdint.h и inttypes.h...

person Michał Górny    schedule 31.07.2012