在Windows 10通用应用程序中使用Boost

Mar*_*inG 10 c++ boost win-universal-app windows-10

我正在开发Windows 10通用应用程序,主要针对Windows手机.当尝试使用boost时,我得到这样的错误:

boost/asio/detail/impl/win_thread.ipp(48): error C2039: 'TerminateThread': is not a member of '`global namespace''
Run Code Online (Sandbox Code Playgroud)

据我所知,这个问题是由于使用win32 api的提升而发生的,Windows 10通用应用程序不支持.我尝试了1.58(当前官方发布)和1.59(发布候选版).有没有我失踪的旗帜?您是否有任何与boost和Windows通用应用程序支持相关的信息?


我创建了最小程序来重现这个错误:

#include <boost/asio.hpp>

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

事实上,我得到的第一个错误是:

c:\program files (x86)\windows kits\10\include\10.0.10240.0\um\processthreadsapi.h(491): error C3861: 'FlsAlloc': identifier not found
Run Code Online (Sandbox Code Playgroud)

Vij*_*dan 4

并非所有 Boost 库都可用于 Windows 通用应用程序。使更多的应用程序能够与通用应用程序一起使用的工作正在进行中。以下是更多信息:https://blogs.msdn.microsoft.com/vcblog/2014/07/18/using-boost-libraries-in-windows-store-and-phone-applications/

帖子作者 Steven Gates 的评论表明 Boost.Asio 可能使用被禁止的 API。我无法链接到个人评论,因此在这里部分引用(强调我的):

Steven Gates @Li Ning 82:Boost.ASIO 依赖于 WinSock API,最近 Windows Phone 8 才允许使用该 API。不过我敢打赌ASIO 正在使用其他被禁止的 API,您必须替换它们。

此外,CreateThread、CreateThreadPool 等在 Windows 通用应用程序中不可用。

如上所述,我假设您必须使用 Boost.Asio 以外的其他东西,其中有一些可能有帮助的附加信息:

模拟多线程的推荐方法是使用Task.Run。您还可以使用TaskFactory.StartNew

为了完整起见,下面是Windows 运行时应用程序的 Win32 和 COM API的列表。以及Windows 运行时应用程序中 Windows API 的替代方案

希望这可以帮助。