如何在GNU Autotools项目中包含Boost?

9

我的项目使用GNU Autotools编译 (aclocal && autoconf && ./configure && make)。我想要使用Boost,并且希望其他人也能够进行编译。

  1. 我应该将Boost放在我的项目目录中,还是依赖于系统的Boost?
  2. 我应该如何告诉Autotools使用Boost? 我已经在谷歌上找到了许多声称可以实现这一点的m4文件,但我应该把这些m4文件放在哪里? 我可以将其中一个储存在我的/usr/share/aclocal目录中,但这无法帮助其他人使用./configure && make来编译项目。
3个回答

17

The Archive提供AX_BOOST_*宏。

我曾经尝试使用boost.m4,但是它实在太慢了,在boost.m4第二次测试库之前,我可以手动用vim编辑包含完整Boost路径的Makefile。

后来我回到了Autoconf Archive并高兴地发现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) \
    ...

1
谢谢,我刚刚在AC_MSG_ERROR needs Boost, but it中遇到了逗号的问题,去掉逗号就解决了。 - aberaud
那么你没有正确引用它([]字符)。 - DanielKO

2

有一个优秀的 boost.m4 宏,您可以在项目中的 m4 子目录中包含它。这些宏位于 configure.ac 中使用 AC_CONFIG_MACRO_DIR([m4]) 定义的位置。

在顶层 Makefile.am 中添加 ACLOCAL_AMFLAGS = -I m4 --install,由 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错误消息。


0
  1. 我肯定会依赖于系统的Boost安装。如果我没记错,上次我构建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能找到它吗?我希望错误消息告诉他们该怎么做:“错误:需要Boost。按照http://...上的说明安装。” - SRobertJames
系统的 Boost 可能已经过时或不兼容,因此您可能需要在家目录中安装不同版本(当您没有 root 访问权限时)。 - DanielKO
在这种情况下,我可能会寻找一个可用的预构建版本Boost。如果找不到,你可能需要为已安装的Boost版本修补源代码或从源代码下载并构建Boost。 - ldav1s
那么,如果您在机器上没有 root 访问权限,找到一个预构建的 boost 又有什么帮助呢?如果您仍然默认使用系统的 boost,下载和从源代码构建就像我所描述的那样,但您仍然必须确保使用它而不是系统的。 - DanielKO
二进制/源代码包通常可以在不安装它们的情况下打开,因此您可以将它们放在一个目录中,就像它们已经构建好了一样。您提到的 AX_BOOST_BASE 宏(我也暗示了)可以通过 configure --with-boost=/path/to/boost 等指令指向这些目录。 - ldav1s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接