c++ - 使用 autotools 为共享库正确安装 config.h

标签 c++ shared-libraries autotools autoconf libtool

我正在将使用 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/

相关文章:

c++ - 我应该在我的代码中使用 size_type

android - 使用 Qt Creator 为 Android 构建 Qt 应用程序时出错

c++ - 运用reinterpret_cast来操作字节

c++ - 在源文件中定义静态方法,并在 C++ 中的头文件中声明

c++ - 如何动态查找并包含库

android - 在android apk中的不同 Activity 中加载.so文件时的内存共享

c++ - 在 Mac OS X 上使用 SWIG 编译 C++

java - 在 MATLAB 中从 Java 加载库时出现 UnsatisfiedLinkError

macos - 自动工具-libtool : link: -rpath with @executable_path on MacOS

c++ - Autotools:在 Makefile.am 中生成源代码和 header