在 autotools 项目中包含(仅标头)库
Posted
技术标签:
【中文标题】在 autotools 项目中包含(仅标头)库【英文标题】:Include a (header-only) library in an autotools project 【发布时间】:2010-11-30 17:17:49 【问题描述】:我想在我的 Autotools 项目中集成一个仅包含标头的 C++ 库。由于库使用 Autoconf 和 Automake,我在 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 可能会起作用:
当然,最好将库保留在项目之外的自己的目录中,并且您只需通过 CFLAGS/LIBS 标志指向它。
【讨论】:
我很想把它放在我的树之外,但我试图减少外部依赖。谢谢,会试试这个。 不起作用。这会在我的程序之后构建库,这显然行不通。以上是关于在 autotools 项目中包含(仅标头)库的主要内容,如果未能解决你的问题,请参考以下文章