错误LNK2019:函数___tmainCRTStartup中引用了未解析的外部符号_main,但这次它不是Windows/Console问题!

Odd*_*ore 20 c++ opengl sdl lnk2019

所以,臭名昭着的错误又回来了.该项目抱怨它无法找到main()方法(这就是错误的意思,对吧).

但是我确实有一个main,我的项目是一个Console项目,应该是.它以前工作过,所以我知道不是那样的.

此外,该项目有太多的类和文件供我发布,所以我会按要求发布您需要的任何类.

它是Visual Studio 2010上的C++,OpenGL和SDL游戏.它不是任何库的问题,因为它突然之前工作正常并且莫名其妙地显示了这个链接器错误.

编辑:main()方法:

int main(int argc, char **argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_ALPHA);
 glutCreateWindow("Game");

 glEnable(GL_DEPTH_TEST);
 glEnable(GL_NORMALIZE);
 glEnable(GL_COLOR_MATERIAL);
 glEnable(GL_BLEND);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

 g = Game();
 glutInitWindowSize(g.getScreenWidth(), g.getScreenHeight());
 //glutPositionWindow(1280, 50);

 // Callbacks
 glutDisplayFunc(handleRedraw);
 glutReshapeFunc(handleResize);
 glutMouseFunc(handleMouseClicks);
 glutPassiveMotionFunc(handleMouseOvers);
 glutKeyboardFunc(handleKeyboardEvents);
 glutTimerFunc(50, moveItemToInventory, 0);

 glutMainLoop();

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

rod*_*igo 53

SDL_main.h自动包含在SDL.h中,所以你总是得到令人讨厌的#define.

写吧:

#include <SDL.h>
#undef main
Run Code Online (Sandbox Code Playgroud)

它应该工作正常

  • @ViktorSehr:基本原理是,你可以使用相同的代码(`INT主要(){...}`)在一个正常的系统(Linux的,MacOS的...)和Windows.在Windows中,得到一个程序,而不在控制台窗口中,你必须写`的WinMain()`,而不是`主()`所以SDL替换您`的main()`和`SDL_main()`与讨厌的宏,然后提供`WinMain()`在一个静态库中调用你的`SDL_main()`它只是工作......除非它没有. (6认同)
  • 考虑到[这个答案](/sf/answers/3506132591/),这似乎不再是你应该这样做的方式(如果它曾经是正确的方式)。 (2认同)

For*_*gic 29

另一种选择实际上是使用常用参数定义自己的main

int main(int argc, char *args[])
{
    // Your code here
}
Run Code Online (Sandbox Code Playgroud)

那应该摆脱错误.

然后,如果您不使用这些参数,并且您还想摆脱编译器警告,您可以在主函数中执行该操作.

(void)argc;
(void)args;
Run Code Online (Sandbox Code Playgroud)


jen*_*ens 11

SDL 文档中的默认解决方案:

tl;博士:

#define SDL_MAIN_HANDLED
#include "SDL.h"
Run Code Online (Sandbox Code Playgroud)

完整示例:

当不使用 SDL_main() 作为入口点时,使用此函数可以避免 SDL_Init() 失败。

#define SDL_MAIN_HANDLED
#include "SDL.h"

int main(int argc, char *argv[])
{
    SDL_SetMainReady();
    SDL_Init(SDL_INIT_VIDEO);

    ...

    SDL_Quit();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //wiki.libsdl.org/SDL_SetMainReady