对 WinMain@16 C++、SDL-2 的未定义引用
undefined reference to WinMain@16 C++, SDL-2
我收到错误 undefined reference to WinMain@16
。保存space,here's a link to all the files currently in the project。目前,除了创建一个 window,将其填充为绿色,然后在角落绘制一个框外,它不应该做太多事情,同时通过控制台跟踪鼠标的位置。但是,它无法构建,并且出现上述错误。
我的 linker 图书馆是:
- glew32s
- libSDL2main
- mingw32
- libSDL2
- opengl32
- glew32
我正在使用 Codeblocks 13.12 和 g++,遵循 C++11 ISO C++ 语言标准。我的电脑正在使用 windows 10 以防相关。
我花了很长时间试图找到一个解决方案,似乎每个人都有一个完全不同的解决方案,到目前为止 none 对我有用。一些示例包括:
- 根据 this similar question 将 SDL2_image 添加到我的 link 库中。它给了我错误
-lSDL2_image
.
- 完全从头开始这个项目,以防万一我没有注意到的错字是原因。 (我得到了完全相同的错误)。
- 正在将我的
main
函数更改为 WinMain
。我收到了同样的错误信息。
- 添加一个
Windows.h
header。这没有什么明显的。
- 各种指控 "right orders" 我喜欢的图书馆。 None 到目前为止似乎有所帮助。
我还应该指出用户提供的答案,干杯和hth。 - Alf,here 可能是我要找的东西,但老实说,我不能完全理解基于它我应该做什么。
如果有任何相关信息我忘记包含,请告诉我,我会尽快这样做。提前致谢。
我想你想要
#define SDL_MAIN_HANDLED
在你的主文件中,行
之前
#include <SDL2/SDL.h>
解释:
在 SDL/SDL2 中,为了尝试cross-platform 简化某些类型应用程序的开发,SDL 为您的应用程序创建了自定义 "entry-point"。也就是说,你的int main()
不是真正的主。发生的情况是,main
在 SDL header 中被定义为一个宏,这会导致您的 main 重命名为 SDL_main
或类似名称。然后,在 "SDL_main" 库中定义了一个不同的 main
,这将是您应用程序的真正 main
。这个 main
只是以适合平台的任何方式获取 command-line 参数,并调用你的 main
(已重命名为 SDL_main
)。
在 windows,关于您的应用程序是作为控制台程序启动还是作为 gui 程序启动,也存在一些差异,iiuc。
有时您希望 SDL 为您做这些事情,但如果您正在开发传统的控制台程序,通常您不会这样做。所以你传递 SDL 这个 SDL_MAIN_HANDLED
定义是为了防止做所有这些事情。
#undef main
方法也可以,但效果不是很好,因为通过这种方式,您告诉 SDL 发生了什么,而使用另一种方法,SDL 认为它的所有内容都将被使用事实上,你后来用 #undef
粗暴地禁用了它。
如果您想查看各种宏/平台检查的详细信息,可以查看 SDL_main.h
header。想知道SDL主系统有什么好处,可以看看SDL文档
接受的答案中建议的解决方案(未定义 main
、定义 SDL_MAIN_HANDLED
等等)偏离了 SDL2 的预期使用方式。预期的方法是否合理是另一个问题,但我还是更愿意坚持下去。
此错误意味着您没有 link 正确的库,或者 link 以错误的顺序编辑它们。
您需要按照以下确切顺序执行以下操作:-lmingw32 -lSDL2main -lSDL2
.
这样做可能会将错误更改为 undefined reference to `SDL_main'
。这意味着您使用的 main
的签名与 SDL 预期的不同。它必须是 int main(int, char **)
或 int main(int, char *[])
。允许添加参数名称,但您不能更改任何其他内容:您必须有参数,即使您不使用它们也是如此。
我收到错误 undefined reference to WinMain@16
。保存space,here's a link to all the files currently in the project。目前,除了创建一个 window,将其填充为绿色,然后在角落绘制一个框外,它不应该做太多事情,同时通过控制台跟踪鼠标的位置。但是,它无法构建,并且出现上述错误。
我的 linker 图书馆是:
- glew32s
- libSDL2main
- mingw32
- libSDL2
- opengl32
- glew32
我正在使用 Codeblocks 13.12 和 g++,遵循 C++11 ISO C++ 语言标准。我的电脑正在使用 windows 10 以防相关。
我花了很长时间试图找到一个解决方案,似乎每个人都有一个完全不同的解决方案,到目前为止 none 对我有用。一些示例包括:
- 根据 this similar question 将 SDL2_image 添加到我的 link 库中。它给了我错误
-lSDL2_image
. - 完全从头开始这个项目,以防万一我没有注意到的错字是原因。 (我得到了完全相同的错误)。
- 正在将我的
main
函数更改为WinMain
。我收到了同样的错误信息。 - 添加一个
Windows.h
header。这没有什么明显的。 - 各种指控 "right orders" 我喜欢的图书馆。 None 到目前为止似乎有所帮助。
我还应该指出用户提供的答案,干杯和hth。 - Alf,here 可能是我要找的东西,但老实说,我不能完全理解基于它我应该做什么。
如果有任何相关信息我忘记包含,请告诉我,我会尽快这样做。提前致谢。
我想你想要
#define SDL_MAIN_HANDLED
在你的主文件中,行
之前#include <SDL2/SDL.h>
解释:
在 SDL/SDL2 中,为了尝试cross-platform 简化某些类型应用程序的开发,SDL 为您的应用程序创建了自定义 "entry-point"。也就是说,你的int main()
不是真正的主。发生的情况是,main
在 SDL header 中被定义为一个宏,这会导致您的 main 重命名为 SDL_main
或类似名称。然后,在 "SDL_main" 库中定义了一个不同的 main
,这将是您应用程序的真正 main
。这个 main
只是以适合平台的任何方式获取 command-line 参数,并调用你的 main
(已重命名为 SDL_main
)。
在 windows,关于您的应用程序是作为控制台程序启动还是作为 gui 程序启动,也存在一些差异,iiuc。
有时您希望 SDL 为您做这些事情,但如果您正在开发传统的控制台程序,通常您不会这样做。所以你传递 SDL 这个 SDL_MAIN_HANDLED
定义是为了防止做所有这些事情。
#undef main
方法也可以,但效果不是很好,因为通过这种方式,您告诉 SDL 发生了什么,而使用另一种方法,SDL 认为它的所有内容都将被使用事实上,你后来用 #undef
粗暴地禁用了它。
如果您想查看各种宏/平台检查的详细信息,可以查看 SDL_main.h
header。想知道SDL主系统有什么好处,可以看看SDL文档
接受的答案中建议的解决方案(未定义 main
、定义 SDL_MAIN_HANDLED
等等)偏离了 SDL2 的预期使用方式。预期的方法是否合理是另一个问题,但我还是更愿意坚持下去。
此错误意味着您没有 link 正确的库,或者 link 以错误的顺序编辑它们。
您需要按照以下确切顺序执行以下操作:-lmingw32 -lSDL2main -lSDL2
.
这样做可能会将错误更改为 undefined reference to `SDL_main'
。这意味着您使用的 main
的签名与 SDL 预期的不同。它必须是 int main(int, char **)
或 int main(int, char *[])
。允许添加参数名称,但您不能更改任何其他内容:您必须有参数,即使您不使用它们也是如此。