我想编译这段代码:
#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
添加到了Project Settings =&gt;链接器=&gt;输入
我该怎么做才能运行这个项目? VS 2012 SP3,空C ++项目。
答案 0 :(得分:40)
根据Dream.In.Code上的this thread:
右键点击项目名称 - &gt;属性 - &gt;展开链接器选项卡 - &gt;系统 - &gt;子系统:确保它是
Console (/SUBSYSTEM:CONSOLE)
或者,如果您想隐藏控制台窗口或debugging a multithreaded application,则应将子系统设置为Window (/SUBSYSTEM:WINDOW)
。
答案 1 :(得分:4)
我发现设置 / SUBSYSTEM:CONSOLE 只是解决方案的一半。下半部分是将SDL_MAIN_HANDLED
添加到您的其他定义中。我用来解决这个问题的线索可以在 SDL_main.h 中找到。设置SDL_MAIN_HANDLED
告诉SDL标头文件您已经提供了main
功能,并且不希望它重新定义自己的入口点。
答案 2 :(得分:2)
不要 #undef main
!虽然在SDL方面重新定义它是一个非常糟糕的做法,但它们有充分的理由:WinMain
在库侧定义并用于运行一些初始化代码,有助于解决兼容性问题。 (当使用不同的SDL实现时,甚至更多,如Steam或移植到其他平台,如Android)
那你该怎么办?在Windows上,您应始终在SDL2main.lib
之前添加SDL2.lib
,并确保您的主要格式为:
int main(int argc, char* argv[]) // CORRECT
void main(int argc, char* argv[]) // WRONG
int main(int, char**) // MAY BE CORRECT
答案 3 :(得分:1)
作为 tinky_winki 写的
右键点击项目名称 - &gt;属性 - &gt;展开链接器选项卡 - &gt; 系统 - &gt;子系统:确保它是控制台(/ SUBSYSTEM:CONSOLE)
但如果您不希望控制台与窗口一起使用, / SUBSYSTEM:WINDOWS
答案 4 :(得分:0)
项目&gt;&gt;属性&gt;&gt;链接器&gt;&gt;高级&gt;&gt;入口点=主要 并申请
答案 5 :(得分:0)
打开 sdl_main.h
更改
#define main sdl_main
到
#define sdl_main main
现在它可以与简单的 int main()一起使用,但这对短期解决方案来说是很糟糕的