如何将boost.asio添加到Windows通用应用程序项目?

时间:2016-05-23 16:03:32

标签: c++ win-universal-app boost-asio

如何将boost.asio添加到Windows通用项目的共享组件?

我是否需要创建单独的项目并在其中包含头文件,还是有更简单的方法?

谢谢!

1 个答案:

答案 0 :(得分:0)

虽然我无法过多地了解Universal Apps的细节(我不是该主题的权威),但我可以告诉您:boost::asio是一个仅限标题的库。这意味着只需将标题包含到C ++项目中,该代码就会直接合并到主程序集中。我强烈建议以这种方式使用它。

如果您要将此标头库仅包含在另一个DLL中,然后将其包含在主应用程序中,那么事情就会变得混乱。首先,你很难为每个目标(x86,x64和ARM)构建二进制文件并维护这些依赖关系,但除此之外,真正令人头疼的是你需要在从一个目标加载时使boost::asio函数运行共享集会。

为了做到这一点,您需要在代码中的::asio winsock_init内定义一个特殊的静态成员。 ::asio使用内部静态自定义引用计数器,使用互锁交换来跟踪其自身的使用情况。当计数器增加到零以上时,调用诸如WSAStartup()之类的东西以确保库与Winsock一起使用。当计数器再次达到零时,出于同样的原因再次调用WSACleanup()

结构winsock_init规避了这项功能,因此您需要正确地从共享程序集中手动调用这些函数,否则您将彻底破坏ASIO和您的应用程序将无法对应用商店部署进行合规性测

此外,每当您尝试将::asio包装到共享程序集中时,您需要在dll中包含特殊源文件一次,然后您需要定义一堆特殊的在此DLL项目和使用此::asio dll的任何项目中提升配置变量。

我的建议是,只需在主程序集中单独包含标题,然后就不会引入所有这些令人头疼的问题。另一种选择是简单地使用C ++ / CLI或Managed C ++,无论它现在被称为什么,并直接从混合C ++代码中访问.NET套接字类。

See here有关将ASIO编译为单独程序集的更多详细信息,如果您真的想要承受我所描述的所有痛苦。