【问题标题】:PACKAGE_VERSION conflicts of multiple config.h in both library and application库和应用程序中多个 config.h 的 PACKAGE_VERSION 冲突
【发布时间】:2017-09-28 19:52:01
【问题描述】:

使用autoconf工具时,包相关的M4宏由AC_INIT定义并存储在config.h中,其中一些如下:

  • PACKAGE
  • PACKAGE_NAME
  • PACKAGE_TARNAME
  • PACKAGE_VERSION
  • PACKAGE_STRING

我的大部分库包含文件都使用此config.h 文件,该文件存储在其自己安装的包含子目录中(即/usr/include/mylib)。

进入我的应用程序,它使用同一个库的包含文件。

此外,这个应用程序有自己的configure.ac/AC_INIT,反过来,它也会在本地生成自己的config.h

在编译时,我收到以下警告消息:

In file include from app.cpp:3:0:
config.h:427:0 warning: "PACKAGE_VERSION" redefined
 #define PACKAGE_VERSION "1.2"
 ^
In file included from <command-line>:0:0:
/usr/include/mylib/config.h:535:0: note: this is the location of the previous definition
#define PACKAGE_VERSION "4.0"

处理多个AC_INIT 生成的PACKAGE 宏组冲突的最佳方法是什么?

【问题讨论】:

    标签: c++ c autoconf


    【解决方案1】:

    我的大部分库包含文件都使用这个 config.h 文件,该文件存储在它自己安装的包含子目录(即 /usr/include/mylib)中。

    对于您遇到的问题,安装config.h 并不是一个好主意。有几种方法可以从包含文件中删除 config.h。一种方法是:

    #if BUILDING_MYLIB
    #include "config.h"
    #endif
    
    ...
    

    然后在构建应用程序时处理其他依赖项。

    【讨论】:

    • 基本上,我已经移植了一个使用 PACKAGE 的现有库。看起来我将不得不煞费苦心地修改每个库的包含文件来做到这一点。坚持一个可能的解决方案而不是一个“不应该做”的答案是否可以?
    • 您应该从config.h 中找出您需要的头文件。我希望他们不需要定义PACKAGE 等。如果您的标头不需要config.h 之外的任何内容,那么删除config.h 并将其添加到您的lib 源文件中非常容易。不幸的是,通常情况并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多