C++ Win32应用程序LNK2001:未解析的外部符号\u main
我一直在尝试在VS2012上创建一个带有GUI的WIN32应用程序(而不是一个简单的控制台应用程序),但我遇到了一个错误。我的项目正在发布配置中。我的主要功能如下所示: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
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
return DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
}
我所尝试的:
1) 使用以下设置创建新的WIN32项目:
- 应用程序类型->Windows应用程序
- 其他选项->空项目(没有SDL!)
- 未选中其他选项
欢迎提供任何建议。问题在于您对
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以单独解决问题。