C++ 当使用/ENTRY:main和/MT运行时库编译为/SUBSYSTEM:WINDOWS时,应用程序崩溃

C++ 当使用/ENTRY:main和/MT运行时库编译为/SUBSYSTEM:WINDOWS时,应用程序崩溃,c++,msvcrt,C++,Msvcrt,我试图创建一个简单的windows应用程序,但它基于main()入口点,因为我需要在其他平台上编译它 #ifdef _WIN32 int __stdcall WinMain(...) { return main2(); } #else int main(...) { return main2(); } #endif 我在VisualStudio中找到了执行此操作的特定指令,但在使用/MD运行时库编译时它似乎可以工作,但在使用/MT时崩溃 这里有一个完整的代码来重现崩溃,它每次都失败。 ==>只

我试图创建一个简单的windows应用程序,但它基于main()入口点,因为我需要在其他平台上编译它

#ifdef _WIN32
int __stdcall WinMain(...) { return main2(); }
#else
int main(...) { return main2(); }
#endif
我在VisualStudio中找到了执行此操作的特定指令,但在使用/MD运行时库编译时它似乎可以工作,但在使用/MT时崩溃

这里有一个完整的代码来重现崩溃,它每次都失败。 ==>只需使用main.cpp文件创建一个空项目并设置:Projet->Properties->C/C++->代码生成->运行时库->/MT

#pragma comment(linker, "/SUBSYSTEM:WINDOWS")
#pragma comment(linker, "/ENTRY:main")
#pragma comment(linker, "/INCLUDE:mainCRTStartup")

int main(int argc, char** argv)
{

    int* a = new int;
    delete a;

    return 0;
}
这会导致以下异常:

ntdll.dll!RtlpWaitOnCriticalSection()   Inconnu
ntdll.dll!RtlpEnterCriticalSectionContended()   Inconnu
ntdll.dll!RtlEnterCriticalSection() Inconnu
Application.exe!__acrt_lock(__acrt_lock_id _Lock) Ligne 55  C++
Application.exe!heap_alloc_dbg_internal(const unsigned __int64 size, const int block_use, const char * const file_name, const int line_number) Ligne 309    C++
Application.exe!heap_alloc_dbg(const unsigned __int64 size, const int block_use, const char * const file_name, const int line_number) Ligne 450 C++
Application.exe!_malloc_dbg(unsigned __int64 size, int block_use, const char * file_name, int line_number) Ligne 496    C++
Application.exe!malloc(unsigned __int64 size) Ligne 27  C++
[Code externe]  
Application.exe!main(int argc, char * * argv) Ligne 9   C++
[Code externe]  
但如果我使用WinMain入口点,它不会失败:

#pragma comment(linker, "/SUBSYSTEM:WINDOWS")

int main(int argc, char** argv)
{

    int* a = new int;
    delete a;

    return 0;
}

INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
{
    return main(1, reinterpret_cast<char**>(&lpCmdLine));
}
#pragma注释(链接器,“/SUBSYSTEM:WINDOWS”)
int main(int argc,字符**argv)
{
int*a=新的int;
删除一条;
返回0;
}
INT WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、PSTR lpCmdLine、INT nCmdShow)
{
回水干管(1,重新解释铸管(&lpCmdLine));
}
我想在没有MSVCRT外部依赖的情况下进行编译,这就是我设置/MT模式的原因


你有什么建议吗?实际上,我已经为这个问题工作了好几天了……

将链接器选项放到控制台(更多信息),仅此而已。 如果不需要控制台,请使用将其与控制台分离

另一个简单的解决方案是让
WinMain
在Windows上调用自定义
main2
,并让main在其他平台上调用相同的main2

#ifdef _WIN32
int __stdcall WinMain(...) { return main2(); }
#else
int main(...) { return main2(); }
#endif

入口点不是
main
WinMain
,而是MS库中用于初始化CRT的函数。您的
main
示例不起作用,因为您绕过了该初始化。
WinMain
示例之所以有效,是因为此初始化发生在
WinMain
开始执行之前。链接到运行库的DLL版本时,加载DLL时会发生此初始化


您应该指定
/SUBSYSTEM:CONSOLE
,或者干脆不使用它,让链接器找出合适的子系统。

您可以根据操作系统的不同使用#ifdef在main和winmain之间切换。
#pragma注释(链接器,/SUBSYSTEM:WINDOWS”)
-您做错了。您应该让构建系统确保将正确的标志传递给编译器/链接器。不要将其放入源文件中。这篇文章似乎试图做两件截然不同的事情:构建一个不依赖VC运行时的windows程序,与构建一个与其他平台使用相同的
main
的windows程序。你具体想完成什么?如果是后者,你为什么要用前者来完成。或者我错过了什么(这不是第一次)。子系统:控制台的问题是,我可以看到控制台出现,即使我用FreeConsole或任何其他方式隐藏它,控制台也会出现一瞬间。我知道我想做的是可能的,因为有些项目可以用CMAKE来完成,但我不能用项目创建来重现CMAKE配置。下面是一个例子: