3

我正在将使用 autotools 构建系统的 C++ 程序转换为使用共享库,介绍 libtool 的使用。大部分程序功能都放在共享库中,由主程序加载,以便将来其他程序可以访问公共代码。

在整个程序和库源代码中,生成的自动标题config.h与通常的宏一起使用:

#if HAVE_CONFIG_H
# include <config.h>
#endif

在 configure.ac 我使用宏来生成它:

AC_CONFIG_HEADERS([config.h])

我的问题是,我是否需要config.h为其他人安装才能使用我的库,如果需要,这样做的适当方法是什么,是否应该重命名以避免冲突等?

我在这方面找到的最多信息在这里:

http://www.openismus.com/documents/linux/building_libraries/building_libraries#installingheaders

但这几乎不是官方消息来源。

4

2 回答 2

10

永远不要安装autoheader 的config.h.

您库的用户最不需要的就是从您的config.h. 您的库可能有HAVE_FOOBAR,但我的软件可能以禁用foobar的方式编译,因此HAVE_FOOBAR会破坏我的编译。

存档中的AX_PREFIX_CONFIG 宏是一种解决方法,其中所有内容都带有前缀。

更好的方法是创建一个模板文件(例如blargconfig.h.in),其中包含以下行:

typedef @BLARG_TYPE@ blarg_int_t;

@BLARG_RANDOM_INCLUDE@

然后AC_SUBST()这些变量在configure.ac

AC_SUBST(BLARG_TYPE, ["unsigned short"])
AC_SUBST(BLARG_RANDOM_INCLUDE, ["#include <somerandomheader.h>"])

然后将其列为输出文件:

AC_CONFIG_FILES([Makefile
                 src/Makefile
                 ...
                 include/blargconfig.h])

.h文件应与nodist_include_HEADERS; 该.h.in文件将自动分发,因为它列在AC_CONFIG_FILES.

此类文件的目的地通常是$libdir/packagename/include. 例如,请参阅GLib ,尽管它们在没有模板的情况下生成(正如autobook 所建议的那样glibconfig.h,通过内联编写整个创建代码)。我发现这种方法比 using 更难维护,但更灵活。configure.acAC_SUBST

当然,为了帮助编译器找到与平台相关的头文件,您可能还想编写一个 pkgconfig 脚本,就像 GLib 那样。

于 2013-10-30T22:09:23.767 回答
1

config.h如果影响界面,则需要安装。实际上,如果#define标头需要 ',而不仅仅是.cc实现/编译单元。

如果config.h有问题,您可以在AC_CONFIG_HEADERS宏中指定另一个名称。例如,AC_CONFIG_HEADERS([foo_config.h])

假设automake,安装标头的最简单方法是:

nodist_include_HEADERS = foo_config.h

在顶层Makefile.amnodist前缀告诉 automake是生成的,foo_config.h而不是与包一起分发的。

如果不使用 automake,请安装foo_config.h$includedir. $exec_prefix/include可以说是生成标头的更正确位置,但实际上前一个位置很好。


我避免使用, 通过在源构建中或与to一起config.h传递相关定义,或在配置时生成标头。很多是测试产生的噪音。它需要更多的基础设施,但这是我更喜欢的。除非您对自动工具感到满意,否则我不会推荐这种方法。CPPFLAGSfoo_CPPFLAGSAC_SUBSTMakefile.amAC_SUBSTfoo.h.inconfig.h

于 2013-10-25T14:14:06.807 回答