【问题标题】:Windows 10 UAP App using Boost Thread can't start on phone使用 Boost Thread 的 Windows 10 UAP 应用程序无法在手机上启动
【发布时间】:2017-08-23 19:21:55
【问题描述】:

我有一个使用 Boost 库的应用程序。在桌面上,Windows UAP 应用程序按预期工作,但在手机(真手机或模拟器)上,应用程序在启动时崩溃,无法调试。

问题似乎来自 boost::thread 库。

以下是重现此问题的简单步骤:

  • 从命令行构建 boost 线程和 date_time(似乎需要链接 date_time):b2 --with-thread --with-date_time toolset=msvc-14.0 variant=debug link=static architecture=x86 windows-api=store cxxflags="/AIC:/winrt"。请注意,“C:/winrt”是与 platform.winmd 所在的“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\store\references”的连接点(因为它似乎需要构建)李>
  • 使用 Visual Studio 2015 创建一个空白 C++ Windows 10 通用应用。
  • 编辑 Mainpage.xaml.cpp 并添加对 boost::thread 的调用,例如:boost::thread workerThread(workerFunc); 其中“workerFunc”是您想要的任何函数。添加所需的包含文件 (#include <boost/thread/thread.hpp>)。在链接选项中,添加 boost 线程库。
  • 现在在手机模拟器中运行应用程序。
  • 结果:应用程序将在加载时崩溃。

这也发生在带有 arm CPU 的真实手机上(使用选项 architecture=arm 构建的 boost)。使用为模拟器构建的相同应用程序无法在台式计算机上重现此问题。只需在您的语言环境机器上运行该应用程序即可。

我错过了什么吗?

【问题讨论】:

    标签: multithreading boost windows-runtime windows-phone win-universal-app


    【解决方案1】:

    问题似乎是 Windows UAP 项目默认链接到手机中不可用的库,例如 ole32.lib。所以它在桌面上编译和工作,但在手机上崩溃,并且没有关于哪个 dll 造成问题的信息。此外,微软的应用验证软件没有提供任何相关信息。

    【讨论】:

      【解决方案2】:

      我也遇到了类似的问题,应用程序在桌面上运行良好,但无法在 Windows Phone 模拟器中加载。我运行了认证工具包,发现应用程序正在使用 boost 正在使用的受限 api(advapi32.dll 中的 CryptGenRandom)。删除该特定函数调用已解决问题。

      【讨论】:

      • 我也预料到了,所以我运行了认证测试(生成包后提出的测试),一切正常。所以在这一点上,我真的不知道该怎么办。问题是我不知道在哪里可以找到任何明确的崩溃错误报告,这可能有助于我找到问题。
      • @Mathieu 您使用的是哪个版本的 boost ?
      • 我们使用 Boost 1.60.0。
      • 我们发现使用 boost 命令行脚本构建 Boost 并不能生成好的库。它与与 Windows Phone 不兼容的库链接。例如,对于 Boost 线程,它使用手机不支持的 ole32 dll。最后,我们通过使用 Visual Studio 2015 为我们使用的每个 Boost 模块创建自己的通用静态库项目来解决我们的问题。对于某些模块,我们必须模拟一些函数才能使用 Windows 10 API。
      猜你喜欢
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2016-05-18
      • 1970-01-01
      • 2016-12-27
      • 2019-12-02
      相关资源
      最近更新 更多