在 autotools 项目中包含(仅标头)库

Posted

技术标签:

【中文标题】在 autotools 项目中包含(仅标头)库【英文标题】:Include a (header-only) library in an autotools project 【发布时间】:2010-11-30 17:17:49 【问题描述】:

我想在我的 Autotools 项目中集成一个仅包含标头的 C++ 库。由于库使用 Autoconf 和 A​​utomake,我在 configure.ac 中使用 AC_CONFIG_SUBDIRS 并将库目录添加到 Makefile.am 中的 SUBDIRS = 行。

我的问题是:如何防止make install安装头库?我正在构建一个二进制文件,所以我的用户不需要这些标头。

我不想篡改库,所以我可以通过解压缩新版本来获取升级。

【问题讨论】:

【参考方案1】:

这是一个想法。

将您不想看到的所有第三方库安装到名为noinst/ 的子目录中。因此,例如,如果您想使用 Boost 之类的东西发布您的项目,请将其解压缩到目录 noinst/boost/ 中。使用AC_CONFIG_SUBDIRS([noinst/boost])。在noinst/Makefile.am 中,执行如下操作:

SUBDIRS = boost
# Override Automake's installation targets with the command ":" that does nothing.
install:; @:
install-exec:; @:
install-data:; @:
uninstall:; @:

效果是,每当从***目录运行某些递归“make install*”或“make uninstall”命令时,递归将停止在noinst/,并且不会访问其子目录。其他递归命令(如“make”、“make clean”或“make dist”)仍会递归到子目录中。

你当然可以直接覆盖install:和朋友到第三方包中,避免额外的noinst/目录。但是如果你像我一样,你不想篡改第三方包来简化他们的更新。 上述设置的另一个好处是,如果有人进入noinst/boost/ 并决定运行make install,它将起作用。当他们安装你的包时,默认情况下它不会发生。

【讨论】:

【参考方案2】:

刚刚遇到类似的问题,在automake manual找到了解决方法:

noinst_HEADERS 将是在仅包含标头且没有关联库或程序的目录中使用的正确变量

安德烈亚斯

【讨论】:

这将导致make install 命令将 noinst 标头与其他所有内容一起安装。【参考方案3】:

那么不要使用SUBDIRS。以下 hack 可能会起作用:

全本地: $MAKE -C thatlib all

当然,最好将库保留在项目之外的自己的目录中,并且您只需通过 CFLAGS/LIBS 标志指向它。

【讨论】:

我很想把它放在我的树之外,但我试图减少外部依赖。谢谢,会试试这个。 不起作用。这会在我的程序之后构建库,这显然行不通。

以上是关于在 autotools 项目中包含(仅标头)库的主要内容,如果未能解决你的问题,请参考以下文章

重构构建系统以使用 Autotools

是否可以在XMLHttpRequest标头中包含antiforgerytoken?

在cmake的所有cpp文件中包含c ++标头[重复]

在框架模块错误中包含非模块化标头

在 C 或 C++ 中包含标头的正确方法

AWS-amplify 在请求中包含 cognito Authorization 标头