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

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

#include <bfd.h>

и вызываю bfd_openr и bfd_close и т.д. из моего кода.

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

bfd.h:

/* 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

Ответ 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...