在Visual Studio 2010中使用OpenGL - 错误LNK2019:函数___tmainCRTStartup中引用的未解析的外部符号_WinMain @ 16

时间:2012-04-14 17:59:59

标签: c++ visual-studio-2010 opengl

我正在Visual Studio中编译这个OpenGL程序。在阅读了大量文章之后,我已经正确地进行了设置。我已将正确的库添加到链接器的其他依赖项中。但是我收到了这个错误:

错误LNK2019:函数_ _tmainCRTStartup中引用的未解析的外部符号 WinMain @ 16

我正在编译的代码是:

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glLoadIdentity ();             /* clear the matrix */
           /* viewing transformation  */
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
   glScalef (1.0, 2.0, 1.0);      /* modeling transformation */ 
   glutWireCube (1.0);
   glFlush ();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
   glMatrixMode (GL_MODELVIEW);
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
}

3 个答案:

答案 0 :(得分:8)

Windows中有两种可执行文件:

  1. 控制台
  2. GUI(Windows)
  3. 唯一的区别是控制台可执行文件会自动打开控制台窗口,而C / C ++ CRT运行时会将标准stdout / stdin / stderr句柄关联到此窗口。否则这两种可执行类型之间没有区别 - 都可以创建新的Windows,绘制东西,使用OpenGL等......

    在Visual Studio中,如果您创建控制台应用程序 - 那么它希望您的入口点被称为“main”。但对于GUI应用程序,它期望入口点函数被称为“WinMain”。因此,如果您不希望在应用程序启动时看到“控制台”窗口,则有两个选项:

    1. 更改项目链接器设置以指示您正在构建GUI应用程序(项目属性 - &gt;链接器 - &gt;系统 - &gt;子系统= Windows)。这将要求您的入口点函数称为WinMain:http://msdn.microsoft.com/en-us/library/ff381406.aspx
    2. 指示链接器即使您要使用GUI应用程序,但您希望将您的入口点称为“main”。您可以在项目属性中执行此操作 - &gt;链接器 - &gt;高级 - &gt;入口点= mainCRTStartup。不要把主要放在那里。把mainCRTStartup放在那里 - 它是一个特殊的C / C ++ CRT函数,它初始化标准C库并自动调用你的main函数。下面是有关此设置的文档:http://msdn.microsoft.com/en-us/library/f9t8842e.aspx
    3. 使用第二个选项意味着您可以使用GLUT,将您的入口点称为“main”,并且在启动时没有打开控制台窗口。

答案 1 :(得分:0)

您可能正在使用某些非标准Microsoft扩展程序,但不希望您定义main,而是WinMain

尝试将main定义为:

int _tmain(int argc, _TCHAR* argv[])

int WinMain(int argc, _TCHAR* argv[])

答案 2 :(得分:0)

您应该将项目创建为控制台应用程序而不是Windows应用程序。

如果您希望您的程序成为控制台应用程序,则需要跳过使用GLUT。然后你要做的是创建一个普通的Windows应用程序并创建自己的OpenGL渲染窗口。这是一个非常复杂的过程,但NeHe提供了满足所有OpenGL编程需求的教程。在这种情况下,我会建议this一个。