我正在将使用 autotools 构建系统的 C++ 程序转换为使用共享库,介绍 libtool 的使用。大部分程序功能都放在共享库中,由主程序加载,以便将来其他程序可以访问公共(public)代码。
在整个程序和库源中,自动 header 生成的 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
但这并不是官方消息来源。
最佳答案
永远不要永远安装autoheader的config.h
。
库的用户最不需要的就是来自 config.h
中泄漏的宏的干扰。您的库可能有 HAVE_FOOBAR
,但我的软件可能以禁用 foobar 的方式编译,因此 HAVE_FOOBAR
会破坏我的编译。
AX_PREFIX_CONFIG macro from the archive是一种解决方法,所有内容都带有前缀。
更好的方法是创建一个模板文件(例如 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 for example ,尽管它们生成的 glibconfig.h
没有模板(通过在 configure.ac
中内联编写整个创建代码,如 the autobook suggests )。我发现这种方法比使用 AC_SUBST
更难维护,但它更灵活。
当然,为了帮助编译器找到依赖于平台的头文件,您可能还想编写一个 pkgconfig 脚本,就像 GLib 那样。
关于c++ - 使用 autotools 为共享库正确安装 config.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19586211/