8

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

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

3 回答 3

17

存档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) \
    ...
于 2013-08-16T22:28:12.517 回答
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,那么这些库依赖项会自动添加到LIBS,LDFLAGS等。


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

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

于 2013-08-16T21:18:49.390 回答
0
  1. 肯定会依赖系统的 Boost 安装。IIRC,我上次构建 Boost 时,它需要非标准工具(autoconf 所需的便携式工具)来构建 Boost。也花了很长时间。
  2. AC_CONFIG_MACRO_DIR是那些 .m4 文件的去向

    AC_CONFIG_MACRO_DIR([m4])
    

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

于 2013-08-16T20:04:16.917 回答