我正在尝试使用BFD库,因此我安装了binutils-dev软件包并包括:

#include <bfd.h>

并从我的代码中调用bfd_openrbfd_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

最佳答案

好吧,使用 header 的最正确方法是在包中也使用自动工具。有些人固执己见,我认为您对此无能为力。

一种替代方法是通过定义所使用的宏来解决检查问题:

#define PACKAGE 1
#define PACKAGE_VERSION 1

当然,如果您已经在定义它们,则可以将它们设置为一些合理的值,例如:
#define PACKAGE "your-program-name"
#define PACKAGE_VERSION "1.2.3"

并将它们用于您的程序。无论如何,您通常都会在某些时候使用类似的方法来保持版本的一致性。

如果您使用的是符合标准的编译器,这应该就足够了,因为这样会声明__STDC__宏,并且一切都会正常进行。好吧,只要您使用的 header 不需要更多的自动配置生成的定义。

例如,如果您想使用plugin-api.h,则实际上必须处理stdint.hinttypes.h的检查...

09-30 16:59