错误 LNK2019:函数 ___tmainCRTStartup 中引用了无法解析的外部符号 _main,但这一次不是 Windows/控制台问题!

问题描述 投票:0回答:5

所以,臭名昭著的错误又回来了。该项目抱怨找不到 main() 方法(这就是错误的含义,对吧)。

但是我确实有一个主项目,而且我的项目是一个控制台项目,这是应该的。它以前有效,所以我知道不是那样的。

此外,该项目有太多的类和文件,我无法将它们全部发布,因此我将根据要求发布您需要的任何类。

这是 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;
}
c++ opengl sdl lnk2019
5个回答
97
投票

SDL_main.h 是从 SDL.h 自动包含的,所以你总是得到讨厌的#define。

只需写:

#include <SDL.h>
#undef main

而且应该可以正常工作


45
投票

另一个选项实际上是使用常用参数定义您自己的 main

int main(int argc, char *args[])
{
    // Your code here
}

这应该可以消除错误。

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

(void)argc;
(void)args;

16
投票

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

tl;博士:

#define SDL_MAIN_HANDLED
#include "SDL.h"

完整示例:

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

#define SDL_MAIN_HANDLED
#include "SDL.h"

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

    ...

    SDL_Quit();

    return 0;
}

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


1
投票

罪魁祸首很可能是

SDL_main.h
。检查您是否不包含该文件,那里有一个令人讨厌的定义:

#define main SDL_main

0
投票

我无法发表评论,所以将其发布在这里。

正如上面 ForceMagic 所说,您需要

main()
声明来包含启动参数,如下所示:
int main(int argc, char *argv[])
(名称实际上可以是任何名称)。

请注意,您需要第二个参数为

char *somename[]
,而不是
char **

他的错误在于你不需要这样做技巧来避免有关未使用参数的警告。只需像这样声明 main 即可:

int main(int, char *[])
,就完成了。

C++17 及更高版本的其他解决方案是将 main 声明为

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[])
。通用修复,以防您稍后可能使用任何此变量。

不,我不能推荐 rodrigo 接受的解决方案。虽然它适用于较小的项目,但很可能会导致某些东西被破坏。可能当您尝试为不同的操作系统进行编译时。

main()
是一个宏毕竟是有原因的。

© www.soinside.com 2019 - 2024. All rights reserved.