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

10

我正在开发Windows 10通用应用程序,主要面向Windows手机。但是在尝试使用boost时,我会遇到像这样的错误:

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

据我所理解,此问题是由于boost使用win32 api而在Windows 10通用应用程序中不受支持所导致的。我尝试了当前官方版本的1.58和预发布版的1.59。我是否缺少任何标志?您是否有任何与boost和Windows通用应用程序支持相关的信息?


我创建了一个最小的程序来复现这个错误:

#include <boost/asio.hpp>

int main()
{
    return 0;
}

实际上,我遇到的第一个错误是:

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

1
报告一个错误,如果您不需要asio,请从构建中排除它。 - user1095108
FlsAlloc可以用于Store应用程序,但TerminateThread不行;它是非常危险的。您需要使用特殊标志来构建具有存储兼容性的Boost吗?(抱歉我不了解Boost)。 - Peter Torr - MSFT
1个回答

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上使用。但我敢打赌ASIO正在使用其他被禁止的API,需要替换。
此外,在Windows通用应用程序中无法使用CreateThread、CreateThreadPool等。
说完以上内容,我会假设您必须使用除了Boost.Asio之外的其他内容,在此提供一些额外的信息,希望可以帮助您:
模拟多线程的推荐方法是使用Task.Run。您也可以使用TaskFactory.StartNew
为了完整起见,这是Windows运行时应用程序的Win32和COM API列表,以及在Windows运行时应用程序中使用的替代方法
希望对您有所帮助。

Marcin正在询问关于C++的问题,但是您建议使用Task.RunTaskFactory.StartNew,这在C++中不可用。 - Yuchen
@YuchenZhong - 这并不完全正确。在使用C++创建UWP时,您将需要使用MS对C++的扩展,以便调用.NET库。请参见C++中Task.Run页面上的此示例: https://msdn.microsoft.com/en-us/library/hh194921(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp - Vijay Varadan

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