如何将boost.asio添加到Windows通用项目的共享组件?
我是否需要创建单独的项目并在其中包含头文件,还是有更简单的方法?
谢谢!
答案 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编译为单独程序集的更多详细信息,如果您真的想要承受我所描述的所有痛苦。