代码之家  ›  专栏  ›  技术社区  ›  baol

使用自动工具时,包名称和其他宏发生冲突

  •  2
  • baol  · 技术社区  · 14 年前

    使用自动工具时(带 config.h 文件)对于库和构建在该库上的软件,编译器都会抱怨某些宏(PACKAGE\u NAME、PACKAGE\u TARNAME等)的重新定义。

    我怎样才能防止这种情况?

    配置h 库中需要一个文件来将其设置传播到使用它的软件。

    现在我有一个包装脚本 library_config.h 包括原件 配置h

    #ifndef LIB_CONFIG_H
    #define LIB_CONFIG_H
    #ifdef HAVE_CONFIG_H
    #  include "config.h"
    #  undef PACKAGE
    #  undef PACKAGE_BUGREPORT
    #  undef PACKAGE_NAME
    #  undef PACKAGE_STRING
    #  undef PACKAGE_TARNAME
    #  undef PACKAGE_VERSION
    #  undef VERSION
    #else
    #  if defined (WIN32)
    #    define HAVE_UNORDERED_MAP 1
    #    define TR1_MIXED_NAMESPACE 1
    #  elif defined (__GXX_EXPERIMENTAL_CXX0X__)
    #    define HAVE_UNORDERED_MAP 1
    #  else
    #    define HAVE_TR1_UNORDERED_MAP 1
    #  endif
    #endif
    #endif
    

    我认为最好的选择是拥有一个没有宏的库:在使用autotools时,如何避免在库中定义包、包名称等?

    编辑:尝试更好地解释。

    当使用 AC_CONFIG_HEADER configure.ac 配置h 包含许多有用定义的文件。这个定义对于库本身(对于它的编译部分和头文件)和客户端软件都很有用。但遗憾的是 AC\ U配置\标题

    2 回复  |  直到 14 年前
        1
  •  2
  •   ndim    14 年前

    如果应用程序可能会动态链接到库,那么将库中的静态字符串静态内置到应用程序中是没有意义的。

    否则,您可能需要查找 ax_prefix_config_h.m4

    我还是会尽量避免安装 config.h 归档并定义库的API,而不必使用

    /* library.h */
    const char library_version[];
    
    /* library.c */
    #include "library.h"
    #include "config.h" /* the library's config.h */
    const char library_version[] = PACKAGE_VERSION;
    
    /* application.c */
    #include "library.h"
    #include "config.h" /* the application's config.h */
    int main()
    {
       print("This is app version %s.\n", PACKAGE_VERSION);
       print("The library is version %s\n", library_version);
       return 0;
    }
    

    确保公共库头文件不存在 #include "config.h" 配置h .

        2
  •  1
  •   ptomato    14 年前

    您应该能够通过调用 AC_CONFIG_SUBDIRS([library]) 在软件的 configure.ac . 这将消除冲突,并且顶级配置中的设置仍将向下传播到子包。

    以下是指向描述此功能的Autoconf手册页面的链接: http://www.gnu.org/software/hello/manual/automake/Subpackages.html