【问题标题】:How to include Boost in GNU Autotools project?如何在 GNU Autotools 项目中包含 Boost?
【发布时间】:2023-03-09 07:31:02
【问题描述】:

我的项目使用 GNU 自动工具 (aclocal && autoconf && ./configure && make) 进行编译。我想使用 Boost,我希望其他人也能够编译它。

  1. 我应该将 Boost 放在我的项目目录中,还是依赖系统的 Boost?
  2. 我应该如何告诉 autotools 使用 Boost?我用谷歌搜索并发现了许多声称这样做的 m4 文件 - 但我应该把这些 m4 文件放在哪里?我可以在我的 /usr/share/aclocal 目录中存储一个,但这对想要使用 ./configure && make 编译项目的其他人没有帮助。

【问题讨论】:

    标签: c++ boost makefile autotools


    【解决方案1】:

    The Archive 拥有AX_BOOST_*

    我切换到boost.m4 有一段时间了,但速度太慢了,我可以在 boost.m4 完成对第二个库的测试之前,在 vim 中手动编辑具有完整 Boost 路径的 Makefile。

    我回到档案库,很高兴得知 boost 宏再次得到积极维护;然后我开始从我的每个项目中清除 boost.m4。

    用例的相关摘录(假设 ax_boost_*.m4 文件位于子目录 m4 中):

    ./bootstrap

    aclocal -I m4 --install
    ...
    

    ./configure.ac

    ...
    AC_CONFIG_MACRO_DIR([m4])
    ...
    AX_BOOST_BASE([1.48],, [AC_MSG_ERROR([libfoo needs Boost, but it was not found in your system])])
    AX_BOOST_SYSTEM
    AX_BOOST_FILESYSTEM
    ...
    

    ./Makefile.am

    ACLOCAL_AMFLAGS = -I m4
    EXTRA_DIST = bootstrap ...
    SUBDIRS = ... src ...
    ...
    

    ./src/Makefile.am

    AM_CPPFLAGS = \
        ... \
        $(BOOST_CPPFLAGS) \
        ...
    
    ...
    
    AM_LDFLAGS = ... \
        $(BOOST_LDFLAGS)
    
    ...
    
    lib_LTLIBRARIES = libFoo.la
    
    ...
    
    libFoo_la_LIBADD = \
        ... \
        $(BOOST_FILESYSTEM_LIB) \
        $(BOOST_SYSTEM_LIB) \
        ...
    

    【讨论】:

    • 谢谢,我只是在 AC_MSG_ERROR needs Boost, but it 中遇到了逗号问题,删除逗号即可解决。
    • 那么您没有正确引用它([] 字符。)
    【解决方案2】:

    有一个出色的boost.m4 宏,您可以将它包含在您的项目中的m4 子目录中。这些宏位于AC_CONFIG_MACRO_DIR([m4]) 中的configure.ac

    ACLOCAL_AMFLAGS = -I m4 --install添加到顶级Makefile.am,供automake使用。

    这就是为什么它是如此出色的宏:

    BOOST_REQUIRE([1.54],[ACTION-IF-NOT-FOUND])
    

    这将定义BOOST_CPPFLAGS,您可以将其添加到CPPFLAGS,在AC_SUBST 中使用,等等。

    对于单个 Boost 组件,可以指定调试构建、静态构建等。但(通常)多线程、动态库是最好的,例如,

    BOOST_FILESYSTEM([mt])
    

    将定义BOOST_FILESYSTEM_LIBSBOOST_FILESYSTEM_LDFLAGS。另外一个好处是,如果库依赖于 Boost.System,那么这些库依赖项会自动添加到 LIBSLDFLAGS 等。


    您应该只指定 Boost 安装是必需的,而不是尝试分发它。它很容易从源代码或预编译包构建和安装。前者需要很长时间,但最好在系统上进行“优化”构建。有很多软件可以使用(强大且优化的)Boost 实现。

    如果没有可用的可接受版本,则使用BOOST_REQUIRE 错误消息。

    【讨论】:

      【解决方案3】:
      1. 肯定依赖系统的 Boost 安装。 IIRC,我上次构建 Boost 时,它需要非标准工具(autoconf 所需的便携式工具)来构建 Boost。也花了很长时间。
      2. AC_CONFIG_MACRO_DIR 是那些 .m4 文件所在的位置

        AC_CONFIG_MACRO_DIR([m4])
        

      宏在“m4”目录中的位置。我希望各种 Boost .m4 宏能够以某种方式告诉 configure 要查找的 Boost 包(用于多个 Boost 安装)以及它在哪里(非标准安装)。

      【讨论】:

      • 谢谢。你能举个例子来说明如何使用AC_CONFIG_MACRO_DIR - 我觉得 AC 很困惑。另外:如果用户按照网站的说明安装了Boost,AC能找到吗?我希望错误消息告诉他们该怎么做“错误:需要提升。按照 http://... 上的说明安装”
      • 系统的 Boost 可能已过时和/或不兼容,因此您可能必须在主目录中安装不同的版本(当您没有 root 访问权限时)。
      • 在这种情况下,我可能会寻找可以工作的预构建版本 Boost。如果做不到这一点,您可能会修补已安装 Boost 版本的源代码或从源代码下载 Boost 并构建它。
      • 所以你在机器上没有 root 访问权限,如果你仍然默认使用系统的 boost,那么如何找到一个预建的 boost 帮助?从源代码下载和构建正是我所描述的,但您仍然必须确保使用它而不是系统的。
      • 二进制/源代码包通常无需在机器上安装就可以打开,因此您可以将它们放在一个目录中,就像它们是构建的一样。您提到的 AX_BOOST_BASE 宏(我也提到过)可以通过configure --with-boost=/path/to/boost 等指向这些目录。
      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 2018-04-27
      • 2021-12-19
      • 2020-03-16
      相关资源
      最近更新 更多