Boost.Asio作为仅包含头文件的库

19
我想在我的项目中使用Boost中的ASIO库。它的文档说如果不使用regex和SSL,它可以只有头文件。但是,运行bcp for asio会拉取许多库,其中一些带有源代码需要编译,例如bjam等。
我能否以仅头文件的形式在项目中使用ASIO,而无需使用库/源代码?我只需要ASIO,不需要Boost的其他部分。
编辑:ASIO需要链接一个名为Boost.System的库 - 这个依赖关系能否被去掉以便我只使用头文件的ASIO?

1
Boost.Asio需要链接到Boost.System。而非Boost Asio则不需要,详见Ralf的回答 - Sam Miller
3个回答

14

据我所知,你可以从http://think-async.com/Asio/AsioAndBoostAsio获取asio的非boost版本。

Boost.Asio使用Boost.System库来支持错误代码(boost::system::error_code和boost::system::system_error)。而Asio将这些类包含在自己的命名空间下(asio::error_code和asio::system_error)。目前,Boost.System版本的这些类为用户定义的错误代码提供更好的可扩展性。

Asio是纯头文件形式的库,对于大多数用途来说不需要链接任何Boost库。但如果你想使用boost::thread启动线程,那么Boost.Asio则总是需要链接Boost.System库以及Boost.Thread库。


我听说过非Boost ASIO,但有些地方写道它仍然需要Boost来构建。 - zaharpopov
根据文档,非 Boost Asio 不需要 Boost,除非您使用带有 boost::regex 参数的 read_until()async_read_until() 重载。 - Hasturkun

12

更新 - 2019年07月25日:

正如@OleThomsenBuus在下面的评论中指出的那样(谢谢!),从Boost 1.69版本开始,Boost.System现在是头文件方式,因此没有必要通过这些步骤消除与其链接的需要。

原始回答:

虽然接受的答案是100%有效和推荐的,但如果您确实想/需要使用Boost Asio,则另一个选项是尝试使用-DBOOST_ERROR_CODE_HEADER_ONLY编译应用程序。使用此宏(在此处记录)应该可以避免需要与Boost.System 链接的需求。然而,值得阅读这个答案中指出的注意事项。特别是,您可能需要创建一个包含以下内容的“虚拟”CPP文件:

#define BOOST_ERROR_CODE_HEADER_ONLY
#include <boost/system/error_code.hpp>

并且仅对该文件禁用优化。(个人而言,我没有必要这样做,但可能会有不同的情况...)


1
宏在此处有文档:http://www.boost.org/doc/libs/1_63_0/libs/system/doc/reference.html 同时,在编译器参数中定义(使用-D)也可以起作用。 - mantal
@mantal,感谢您的澄清,我编辑了我的答案并包含了一个指向Boost.System文档的链接。 - evadeflow
2
在MSVC中,我还需要-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB -DBOOST_SYSTEM_NO_LIB。虽然不需要虚拟cpp文件。 - jtbr
1
请注意,在使用asio头文件时,还需要添加-DBOOST_SYSTEM_NO_DEPRECATED参数以确保程序正常运行:在编译器命令行中添加参数“-DBOOST_ERROR_CODE_HEADER_ONLY -DBOOST_SYSTEM_NO_DEPRECATED”。 - daminetreg
1
从Boost 1.69开始,Boost.System现在是仅头文件(文档)。宏BOOST_ERROR_CODE_HEADER_ONLY似乎已从参考文档中删除。 - Ole Thomsen Buus

4
我认为bcp拉取了正则表达式库,因为它可以被使用(在Windows机器上默认使用)。如果需要编译Windows版本,请确保添加正确的编译器标志(-DBOOST_DATE_TIME_NO_LIB-DBOOST_REGEX_NO_LIB),您可以无问题地删除正则表达式库源文件。这些细节来自于此页面(听起来您已经找到了)。
我不确定bcp有多聪明,我不认为您可以向其传递以上给出的定义以防止它跟随mscv路线。

看我的修改 - ASIO 还需要 Boost.System,这不仅仅是头文件。 - zaharpopov

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