【问题标题】:What / where is __scrt_common_main_seh?__scrt_common_main_seh 是什么/在哪里?
【发布时间】:2021-03-07 16:11:57
【问题描述】:

我的程序中的第三方库试图通过 Microsoft 库 msvcrt.lib 调用 __scrt_common_main_seh,但它是由某个未知库定义的,因此会出现链接器错误。我不知道这个函数应该做什么,也不知道它是在哪里定义的。

我在网上找了这个函数,但除了对链接器错误的一般描述外,没有找到任何线索。

我相信它可能正在为 win32 GUI 应用程序做一些设置。定义它的库可能会被 Visual Studio 配置为项目依赖项,但我的项目正在使用 Bazel。

【问题讨论】:

  • __scrt_common_main_seh 是 C 和 C++ 语言运行时启动代码,最终在全局 SEH 异常过滤器下运行您的代码。当您的代码以灾难性方式失败时,您至少会从中获得一些错误诊断。从问题中完全不清楚您处于什么情况,但很明显您的proposed answer 充其量只是猜测。原生开发者中有句老话是这样的:如果你不知道为什么你的代码可以工作,那么它就不会。
  • 感谢@IInspectable。我认为您可以很好地改进我的答案。您也许能够解释什么是 SEH 异常过滤器,它是如何被实例化的,以及在什么情况下链接器无法找到它。

标签: c++ windows winapi


【解决方案1】:

总结

对于有错误error LNK2019: unresolved external symbol main referenced in function "int __cdecl __scrt_common_main_seh(void)" 的非控制台应用程序,请尝试添加链接器标志/ENTRY:wWinMainCRTStartup/ENTRY:WinMainCRTStartup

对于出现该错误的控制台应用程序,请确保实现 main() 函数。

详情

This answer 表明__scrt_common_main_seh 通常在mainCRTStartup 期间被调用,这是Windows 控制台 应用程序的默认entry point。然后__scrt_common_main_seh(间接)负责调用main()

我的程序没有main() 函数,这可能会阻止编译器生成__scrt_common_main_seh(只是推测。我完全不知道是谁定义了__scrt_common_main_seh

不过,我确实发现我链接的库定义了一个wWinMain() 函数。所以我尝试添加链接器标志/ENTRY:wWinMainCRTStartup,链接器错误消失了。

【讨论】:

    猜你喜欢
    • 2017-02-27
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多