C++ 如何在GNU自动工具项目中包含Boost?
我的项目使用GNU自动工具(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编译项目的其他人没有帮助 我肯定会依赖
aclocal&&autoconf&&./configure&&make
)进行编译。我想使用Boost,我希望其他人也能编译它
/usr/share/aclocal
目录中保存一个,但这对希望使用/configure&&make
编译项目的其他人没有帮助AC\u CONFIG\u MACRO\u DIR
是这些.m4文件的存放位置
AC_CONFIG_MACRO_DIR([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) \
...