SDL2:LNK1561:必须定义入口点
Posted
技术标签:
【中文标题】SDL2:LNK1561:必须定义入口点【英文标题】:SDL2: LNK1561: entry point must be defined 【发布时间】:2013-09-11 09:52:33 【问题描述】:我要编译这段代码:
#include <SDL.h>
int main(int argc, char* argv[])
return 0;
但无法链接:Error 1 error LNK1561: entry point must be defined
这个库中有一些奇怪的代码:http://hg.libsdl.org/SDL/file/75726efbf679/include/SDL_main.h
#define main SDL_main
我还添加了SDL2.lib;SDL2main.lib
到项目设置 => 链接器 => 输入。
我可以做些什么来运行这个项目? VS 2012 SP3,空 C++ 项目。
【问题讨论】:
Why SDL defines main macro?的可能重复 @MikeSeymour,这不是重复的:该线程不包含答案。 @computer,是的,控制台。 我刚开始学习c,遇到了同样的错误,这个错误意味着main()
不正确,在我的代码中我把它拼错为Main
,大写m,在纠正错误后消失了。
【参考方案1】:
根据 Dream.In.Code 上的this thread:
右键项目名称->属性->展开链接器选项卡->系统->子系统:确保是
Console (/SUBSYSTEM:CONSOLE)
或者,如果你想隐藏控制台窗口或者是debugging a multithreaded application,你应该将SubSystem设置为Window (/SUBSYSTEM:WINDOW)
。
【讨论】:
补充说,如果你可以让 int main() 自行编译,那么请确保你已经检查了这里提到的编译器设置,这取决于你创建项目的方式可能意味着此设置尚未为您完成。就像我的问题一样。 我正在添加到这个答案。如果您正在调试 SDL2 应用程序,并且您已将多线程添加到所述应用程序,而不是使用Console (/SUBSYSTEM:CONSOLE)
,请使用 Window (/SUBSYSTEM:WINDOW)
。这也应该让 Visual Studio 2017 将其本地调试器成功附加到您的 SDL2 应用程序,从而允许您同时调试多个线程。
没有时间编辑我的最后一条评论...您必须使用Window (/SUBSYSTEM:WINDOW)
的原因是因为Console (/SUBSYSTEM:CONSOLE)
仅是单线程的。【参考方案2】:
我发现设置 /SUBSYSTEM:CONSOLE 只是解决方案的一半。后半部分是将SDL_MAIN_HANDLED
添加到您的附加定义中。我用来解决这个问题的线索可以在 SDL_main.h 中找到。设置SDL_MAIN_HANDLED
告诉SDL 头文件您已经提供了main
函数并且不希望它重新定义自己的入口点。
【讨论】:
这是解决这个问题的正确方法-良好的调试技巧@dpiron。如果您的项目一开始就设置正确,则在此阶段不需要更改链接器属性 要向@user3001499 所指的内容添加更多信息,您需要从一个win32 应用程序项目开始,参见VisualC.html。【参考方案3】:不要#undef main
!虽然在 SDL 方面重新定义它是一个非常糟糕的做法,但他们有充分的理由:WinMain
是在库方面定义的,用于运行一些初始化代码,有助于解决兼容性问题。 (在使用不同的 SDL 实现时更是如此,例如 Steam 或移植到其他平台,例如 android)
那你该怎么办?在 Windows 上,您应该始终在 SDL2.lib
之前包含 SDL2main.lib
,并确保您的 main 格式为:
int main(int argc, char* argv[]) // CORRECT
void main(int argc, char* argv[]) // WRONG
int main(int, char**) // MAY BE CORRECT
来源:SDL2 Windows FAQ
【讨论】:
int main(int, char**)
也是正确的。另外,Steam SDL 的实施情况如何? Google 似乎对此一无所知。
@HolyBlackCat wiki.libsdl.org/Installation#SteamOS SDL 提供动态加载器,并且已知 Steam 包含它自己的 SDL 副本,这与 SteamOS 不同
请注意,还需要创建一个win32 应用程序项目。见VisualC.html。【参考方案4】:
正如一个tinky_winki所写
项目名称右键->属性->展开链接器选项卡-> 系统 -> 子系统:确保它是控制台 (/SUBSYSTEM:CONSOLE)
但如果你不希望控制台简单地使用窗口,/SUBSYSTEM:WINDOWS
【讨论】:
谁是tinky_winki?他们在哪里写的?【参考方案5】:项目>>属性>>链接器>>高级>>入口点=主 并申请
【讨论】:
【参考方案6】:打开 sdl_main.h
改变
#define main sdl_main
到
#define sdl_main main
现在它可以与简单的 int main() 一起使用,但这对于短期解决方案来说很糟糕
【讨论】:
这是零意义。它与#undef main
没有什么不同,只是你正在修改库头。以上是关于SDL2:LNK1561:必须定义入口点的主要内容,如果未能解决你的问题,请参考以下文章
错误:链接:致命错误 LNK1561:入口点必须定义 C++
MFC项目中:报错:“fatal error LNK1561: 必须定义入口点”解决方法