C++ 如何在GNU自动工具项目中包含Boost?

C++ 如何在GNU自动工具项目中包含Boost?,c++,boost,makefile,autotools,C++,Boost,Makefile,Autotools,我的项目使用GNU自动工具(aclocal&&autoconf&&./configure&&make)进行编译。我想使用Boost,我希望其他人也能编译它 我应该在项目的目录中添加Boost,还是依赖系统的Boost 我应该如何告诉autotools使用Boost?我在谷歌上搜索了很多m4文件,它们声称可以这样做——但我应该把这些m4文件放在哪里呢?我可以在我的/usr/share/aclocal目录中保存一个,但这对希望使用/configure&&make编译项目的其他人没有帮助 我肯定会依赖

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

  • 我应该在项目的目录中添加Boost,还是依赖系统的Boost
  • 我应该如何告诉autotools使用Boost?我在谷歌上搜索了很多m4文件,它们声称可以这样做——但我应该把这些m4文件放在哪里呢?我可以在我的
    /usr/share/aclocal
    目录中保存一个,但这对希望使用
    /configure&&make
    编译项目的其他人没有帮助
  • 我肯定会依赖系统的Boost安装。IIRC,上次我构建Boost时,它需要非标准工具(wrt autoconf所需的便携工具)来构建Boost。这也花了很长时间
  • AC\u CONFIG\u MACRO\u DIR
    是这些.m4文件的存放位置

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

    m4
    子目录中的项目中可以包含一个优秀的宏。这些宏位于
    configure.AC
    中的
    AC\u CONFIG\u MACRO\u DIR([m4])

    添加
    ACLOCAL\u AMFLAGS=-I m4--install
    到顶级
    Makefile.am
    ,由
    automake
    使用

    这就是为什么它是一个如此好的宏:

    BOOST_REQUIRE([1.54],[ACTION-IF-NOT-FOUND])
    
    这将定义
    BOOST\u CPPFLAGS
    ,您可以将其添加到
    CPPFLAGS
    ,并在
    AC\u SUBST
    中使用

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

    BOOST_FILESYSTEM([mt])
    
    将定义
    BOOST\u FILESYSTEM\u LIBS
    BOOST\u FILESYSTEM\u LDFLAGS
    。另一个好处是,如果库依赖于(比如)Boost.System,那么这些库依赖项将自动添加到
    LIBS
    LDFLAGS
    ,等等


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

    如果没有可用的可接受版本,则使用
    BOOST\u REQUIRE
    错误消息。

    具有
    AX\u BOOST.*

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

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

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

    /引导 /configure.ac /Makefile.am ./src/Makefile.am
    谢谢你能举一个如何使用
    AC\u CONFIG\u MACRO\u DIR
    的例子吗?我觉得AC很困惑。另外:如果用户按照网站的说明安装Boost,AC是否能够找到它?我希望错误消息告诉他们该怎么做“错误:需要Boost。请按照上的说明安装。”http://...“系统的Boost可能已过时和/或不兼容,因此您可能必须在主目录中安装其他版本(当您没有根目录访问权限时)。在这种情况下,我可能会寻找一个可以工作的预构建版本增强。否则,您可能会为已安装的Boost版本修补源代码,或者从源代码下载Boost并构建它。因此,您在计算机上没有root访问权限,如果默认情况下仍在使用系统的Boost,如何找到预构建的Boost帮助?从源代码下载和构建正是我所描述的,但您仍然必须确保使用它而不是系统的。通常,二进制/源代码包可以在不在计算机上安装的情况下打开,因此您可以将它们放在目录中,就像它们是构建的一样。您提到的AX_BOOST_BASE宏(我也提到过)可以通过
    configure--with BOOST=/path/to/BOOST
    等方式指向这些目录。谢谢,我刚刚遇到了AC_MSG_ERROR
    中的逗号问题,但是它需要BOOST,删除逗号解决了这个问题。然后您没有正确引用它(The
    [
    ]
    字符。)
    aclocal -I m4 --install
    ...
    
    ...
    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
    ...
    
    ACLOCAL_AMFLAGS = -I m4
    EXTRA_DIST = bootstrap ...
    SUBDIRS = ... src ...
    ...
    
    AM_CPPFLAGS = \
        ... \
        $(BOOST_CPPFLAGS) \
        ...
    
    ...
    
    AM_LDFLAGS = ... \
        $(BOOST_LDFLAGS)
    
    ...
    
    lib_LTLIBRARIES = libFoo.la
    
    ...
    
    libFoo_la_LIBADD = \
        ... \
        $(BOOST_FILESYSTEM_LIB) \
        $(BOOST_SYSTEM_LIB) \
        ...