C++ Win32应用程序LNK2001:未解析的外部符号\u main

C++ Win32应用程序LNK2001:未解析的外部符号\u main,c++,winapi,visual-studio-2012,linker,static-linking,C++,Winapi,Visual Studio 2012,Linker,Static Linking,我一直在尝试在VS2012上创建一个带有GUI的WIN32应用程序(而不是一个简单的控制台应用程序),但我遇到了一个错误。我的项目正在发布配置中。我的主要功能如下所示: int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), N

我一直在尝试在VS2012上创建一个带有GUI的WIN32应用程序(而不是一个简单的控制台应用程序),但我遇到了一个错误。我的项目正在发布配置中。我的主要功能如下所示:

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{

    return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}
我所尝试的:

1) 使用以下设置创建新的WIN32项目:

  • 应用程序类型->Windows应用程序
  • 其他选项->空项目(没有SDL!)
  • 未选中其他选项
2) 在Unicode和多字节字符集之间进行更改

3) 将子系统(从Windows(/SubSystem:Windows)更改为未设置)

4) 添加入口点(main;_main;WinMain)

5) 添加#unde#ATL(u MIN)CRT(我很确定它已经被禁用了,但仍然是为了额外的保险…)

这些都没有解决我的问题。我在互联网上搜索过,没有发现任何人有类似的问题(创建WIN32应用程序)并解决了他们的问题

编辑:我还使用Allegro 5库,并使用/MT构建程序


欢迎提供任何建议。

问题在于您对
main
函数使用了错误的调用约定。正如的文档所解释的,带有前导下划线且没有其他装饰的符号表示C调用约定

main
函数的签名应为:

extern "C" __cdecl void main();

请注意,返回值和参数列表都不是名称修饰的一部分,因为调用方负责清理。这意味着任何函数签名都可以用来满足链接器的要求。

经过一番搜索,我找到了答案


我所需要做的就是定义ALLEGRO_NO_MAGIC__MAIN。

我认为WinMain可能只是用于GUI应用程序,而不是控制台…我没有尝试制作控制台应用程序…所以你试图使用一些预先存在的代码并将其“融入”一个新的VS项目,对吗?@rogerdpack
WinMain
只是一个名称。上面发布的签名是任何Windows可执行文件的签名。无论如何,Windows中没有GUI应用程序或控制台应用程序。这是一个可执行文件。你似乎在不清楚的理解下四处游荡。你似乎正在改变你能想到的每一个设置。您声明您已经设置了
/SUBSYSTEM:WINDOWS
。在这种情况下,编译器为什么要查找
\u main
。你描述的症状与你陈述的事实不一致。请尝试将其清除。好的,但是Visual Studio不应该看到我正在制作一个WIN32应用程序,并用适当的表单替换我的吗?Visual Studio是一个按照您的指示执行的工具。如果希望
WinMain
作为您的入口点,您应该设置
/SUBSYSTEM:WINDOWS
,并为链接器设置提供您的入口点选择。如果是这种情况,CRT不应尝试调用
main
,而应调用
WinMain
。移除Allegro 5以单独解决问题。