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

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

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

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

【问题讨论】:

    标签: c++ build-process autotools autoconf automake


    【解决方案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 标志指向它。

      【讨论】:

      • 我很想把它放在我的树之外,但我试图减少外部依赖。谢谢,会试试这个。
      • 不起作用。这会在我的程序之后构建库,这显然行不通。
      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-09
      相关资源
      最近更新 更多