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

时间:2013-08-16 19:49:56

标签: c++ boost makefile autotools

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

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

3 个答案:

答案 0 :(得分:17)

The ArchiveAX_BOOST_*

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

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

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

./自举

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 :(得分:2)

您可以在m4子目录中的项目中包含一个优秀的boost.m4宏。这些宏位于AC_CONFIG_MACRO_DIR([m4])的{​​{1}}。

configure.ac添加到ACLOCAL_AMFLAGS = -I m4 --install使用的顶级Makefile.am

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

automake

这将定义BOOST_REQUIRE([1.54],[ACTION-IF-NOT-FOUND]) ,您可以将其添加到BOOST_CPPFLAGS,在CPPFLAGS中使用,等等。

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

AC_SUBST

将定义BOOST_FILESYSTEM([mt]) BOOST_FILESYSTEM_LIBS。另外,如果库依赖于Boost.System,那么这些库依赖项会自动添加到BOOST_FILESYSTEM_LDFLAGSLIBS等。


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

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

答案 2 :(得分:0)

  1. 肯定依赖系统的Boost安装。 IIRC,我最后一次构建Boost时需要非标准工具(用于autoconf所需的便携式工具)来构建Boost。这也需要很长时间。
  2. AC_CONFIG_MACRO_DIR是那些.m4文件的地方

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