cro*_*bar 3 c++ autoconf autotools shared-libraries libtool
我正在转换一个C++程序,该程序使用autotools构建系统来使用共享库,引入了libtool的使用.大多数程序功能都放在由主程序加载的共享库中,以便将来可以访问其他程序的公共代码.
在整个程序和库源中,生成的autoheader config.h与通常的宏一起使用:
#if HAVE_CONFIG_H
# include <config.h>
#endif
Run Code Online (Sandbox Code Playgroud)
在configure.ac中我使用宏来生成它:
AC_CONFIG_HEADERS([config.h])
Run Code Online (Sandbox Code Playgroud)
我的问题是,我是否需要安装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宏是一种变通方法,其中所有内容都有前缀.
更好的方法是blargconfig.h.in使用以下行创建模板文件(例如):
typedef @BLARG_TYPE@ blarg_int_t;
@BLARG_RANDOM_INCLUDE@
Run Code Online (Sandbox Code Playgroud)
然后AC_SUBST()是那些变量configure.ac:
AC_SUBST(BLARG_TYPE, ["unsigned short"])
AC_SUBST(BLARG_RANDOM_INCLUDE, ["#include <somerandomheader.h>"])
Run Code Online (Sandbox Code Playgroud)
然后将其列为输出文件:
AC_CONFIG_FILES([Makefile
src/Makefile
...
include/blargconfig.h])
Run Code Online (Sandbox Code Playgroud)
该.h文件应列出nodist_include_HEADERS; 该.h.in文件将自动分发,因为它列在AC_CONFIG_FILES.
这些文件的目的地通常是$libdir/packagename/include.例如,请参阅GLib,尽管它们在glibconfig.h没有模板的情况下生成(通过内联编写整个创建代码configure.ac,如同井下建议的那样).我发现这种方法比使用方法更难维护AC_SUBST,但它更灵活.
当然,为了帮助编译器找到依赖于平台的头文件,您可能还想编写一个pkgconfig脚本,就像GLib一样.