可以在没有 boost 或 C++11 的情况下使用 Asio 吗?

Posted

技术标签:

【中文标题】可以在没有 boost 或 C++11 的情况下使用 Asio 吗?【英文标题】:Can Asio be used without boost or C++11? 【发布时间】:2015-04-15 21:26:45 【问题描述】:

我正在寻找一些库来帮助构建一个可扩展的 tcp/ip 服务器,而 Boost::ASIO 看起来很不错,可以使异步套接字 i/o 跨平台均匀工作(我们至少需要支持 OSX、Linux x86、和 Windows,可能是 Solaris,也可能是 HP-UX 和 AIX)。

管理层坚决反对在我们的产品中使用 Boost,主要是因为它“臃肿”,并且由于我们过去遇到过冲突问题,因为我们的代码与客户代码静态链接(这可能也在使用 boost,可能不是同一个版本)。

Asio 页面声称它可以在没有 boost 的情况下使用,尽管它很模糊,因为后来它还说“当使用 C++11 时...... Asio 可以独立于 Boost 使用......”,这似乎暗示它不适用于 C++03 编译器。我在想我可以在包含标题之前简单地做一个“#define asio private_asio”以避免符号冲突问题。

我刚刚在我的本地机器上测试了 VS2013,它编译了;有谁知道需要哪些特定的 C++11 功能?我需要(至少)在 Windows 上支持 VS2012/2013,在 linux 上支持 gcc 4.4(可能是 4.3),在 OSX 上支持 XCode 5.1。

我猜问题出在旧版本的 GCC 上……

【问题讨论】:

这非常令人困惑。该库声称是独立的,但我在其中发现了一堆用于 boost 标头的包含。我能做的最好的就是将您指向这里 think-async.com/Asio/AsioAndBoostAsio 并建议构建一个示例应用程序以使用适当的定义进行测试和查看,您可以编译一个无升压的非 C++11 示例。 这个answer 对一个类似的问题可能会提供一些帮助 管理层希望为人员提供灵活的交通解决方案。但是他们对汽车死心塌地,因为汽车是臃肿的,因为汽车带有***、座椅和挡风玻璃等。对不起,你的问题不是boost。 【参考方案1】:

我在 MS VC++ 2013 中使用了 ASIO,没有使用 Boost 的任何其他部分。

大多数 ASIO 代码使用 boost::bind,但 VC++ 2013 包含一个 std::bind 可以正常工作。相当多的 Boost 演示代码也使用了boost::array,但这只是一个相当普通的数组——您可以使用std::array,或std::vector,或任何数量的其他可能性。

警告:虽然这对我来说效果很好,但我很确定我没有使用 ASIO 的所有部分,而且我更加确定我没有将它们组合在一起方式。因此,我可以说它已经奏效了,而且我不记得任何似乎与缺乏使用 Boost 其他部分有关的问题,但在当时,总是有可能(取决于你使用什么以及如何使用)你可能会遇到一个我从未遇到过的问题(例如,与 boost::bind 一起工作的东西,在 VC++ 2013 的 std::bind 实现中不起作用(至少以相同的方式)。

其他编译器就不太确定了——使用较新版本的 gcc 不会有问题,但 4.4 或 4.3 实在是太老了。自从我在 OS X 上做任何事情以来已经够久了,我不确定 XCode 5.1 的编译器是什么。

【讨论】:

我想知道最低要求,而不是示例中的内容或是否易于使用(我们可能会为处理程序做自定义仿函数类,因为没有 lambda)【参考方案2】:

Asio 可能正在使用 placeholder 或 smart pointers 甚至 bind() 函数,它们是 boost 的一部分并包含在 C++11 标准库中。没有这些,您将无法使用 asio。

【讨论】:

【参考方案3】:

https://github.com/chriskohlhoff/asio/tree/master/asio/src/examples

Asio 的示例似乎充满了 C++03、C++11 和 C++14 版本。在这种情况下,Asio 应该使用 C++03

【讨论】:

是的,但我想知道如果您完全使用它而不使用增强,则需要哪些 C++11 功能。当您在 C++03 编译器上构建它时,它似乎通过借用 boost 来“填充”一些缺少的功能。

以上是关于可以在没有 boost 或 C++11 的情况下使用 Asio 吗?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不重新启动应用程序的情况下使 NSBundle 本地化缓存失效? [iOS]

如何在没有单击事件的情况下使特定的 TabItem 获得对 TabControl 的关注?

是否可以在没有 BackgroundWorker 的情况下使 WinForms 响应? [关闭]

如何在没有固定高度的情况下使动态div溢出

是否可以在不关闭 .txt 的情况下使 StreamWriter 覆盖行?

是否可以在第一列不动的情况下使 UICollectionView 视图水平滚动?