【问题标题】:Visual Studio 2015 c++/CLI boost::thread [duplicate]Visual Studio 2015 c++/CLI boost::thread [重复]
【发布时间】:2017-02-26 03:27:25
【问题描述】:

所有 Visual Studio 版本都存在此问题,但在 VS 2015 中,“旧技巧”似乎不再适用。

这是我尝试过的:

  • 在 VS 2013 和 2015 中创建一个 Windows 窗体应用程序(自 VS 2013 以来该宏已丢失,因此请参阅此帖子:Can't find Windows Forms Application for C++

  • 将 boost headers 路径添加到其他包含目录

  • 在cpp中添加#include "boost/thread.hpp"

  • 添加以下预处理器定义 (BOOST_USE_WINDOWS_H;BOOST_ALL_NO_LIB;BOOST_ALL_DYN_LINK)

  • 添加链接器依赖项以提升线程和系统库

构建小型测试应用程序会编译并与 VS 2013 和 2015 链接。但是当启动在 VS 2015 中构建的应用程序时,应用程序崩溃:

TestCLRForms.exe 中的 0x0000000077C3EB18 (ntdll.dll) 引发异常:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF。

这是调用堆栈:

ntdll.dll!0000000077c3eb18()    Unknown
KernelBase.dll!000007fefdcd304a()   Unknown
ucrtbased.dll!000007fee02bdeb1()    Unknown
ucrtbased.dll!000007fee02bf9d7()    Unknown
ucrtbased.dll!000007fee02c0438()    Unknown
ucrtbased.dll!000007fee02bfb79()    Unknown
ucrtbased.dll!000007fee02e981d()    Unknown
ucrtbased.dll!000007fee02e9545()    Unknown
ucrtbased.dll!000007fee02e962c()    Unknown
ucrtbased.dll!000007fee02e9d6f()    Unknown
TestCLRForms.exe!_onexit(int(*)() function=0x000000013f627b50) Line 268 C++
TestCLRForms.exe!atexit(void(*)() function=0x000000013f627b50) Line 276 C++
TestCLRForms.exe!__scrt_initialize_thread_safe_statics() Line 109   C++
[Managed to Native Transition]  
TestCLRForms.exe!_initterm_e(int (__cdecl*)()* pfbegin=0x00000000001ad680, int (__cdecl*)()* pfend=0x00000000001ad688) Line 69  C++
TestCLRForms.exe!<CrtImplementationDetails>::LanguageSupport::InitializeNative() Line 355   C++
TestCLRForms.exe!<CrtImplementationDetails>::LanguageSupport::_Initialize() Line 598    C++
TestCLRForms.exe!<CrtImplementationDetails>::LanguageSupport::Initialize() Line 805 C++
TestCLRForms.exe!.cctor() Line 856  C++
[Native to Managed Transition]  
[Managed to Native Transition]  
[Native to Managed Transition]  
mscoreei.dll!000007fef8107fd5() Unknown
mscoree.dll!000007fef81a5b21()  Unknown
kernel32.dll!0000000077b159cd() Unknown
ntdll.dll!0000000077c4a2e1()    Unknown

仅针对 x64 测试。

有人有想法吗?谢谢

【问题讨论】:

    标签: visual-studio-2015 c++-cli boost-thread


    【解决方案1】:

    我找到了一个(至少部分)解决上述问题的解决方法。我把它贴在这里,其他人可能会觉得它有用。

    如果链接器/系统中的子系统选项设置为控制台并且链接器/高级中的入口点留空(重要!),则不会发生崩溃并且应用程序可以正常工作。这种解决方法的缺点是控制台窗口与 GUI 应用程序一起打开。

    我个人可以接受,因为我的应用程序只是一个测试程序,但对其他人来说可能无法接受。

    如果有人能找到更好的解决方案,原始问题仍然悬而未决。

    【讨论】:

      【解决方案2】:

      您可以将属性->链接器->高级->入口点更改为 ?mainCRTStartupStrArray@@$$FYMHP$01AP$AAVString@System@@@Z(32 位,参见https://bytes.com/topic/net/answers/642179-c-cli-winforms-app-native-static-library-singletons-cra)或

      ?mainCRTStartupStrArray@@$$FYMHP$01EAPE$AAVString@System@@@Z(64 位,感谢@Hans Passant,他回答了我的问题Entry point for C++/CLI x64 WindowsForms App (VS 2015)

      那么应用程序应该可以正常启动了。

      【讨论】:

        猜你喜欢
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-08
        • 2018-01-01
        相关资源
        最近更新 更多