2010-11-21 122 views
2

我已经找了这个错误,并尝试了一些解决方案,但没有找到任何东西,在这一点上,我只是想编译它。C++ linux编译错误:未定义的参考'主'

我得到的错误是:

/usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/crt1.o: In function `_start': 
/build/buildd/eglibc-2.10.1/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main' 

使用:

g++ -lglut Solar.cpp 

的代码是在这里:

using namespace std; 
#include <stdio.h> 
#include <GL/glut.h> 
#include "math.h" 

class Solar { 

    int main(){ 
    initializeGL(); 
    //Stars Alpha = new Stars(5.0); 
    //Stars *Alpha = new Stars(5.0); 
    //Planets *Awe = new Planets(.6,2,30,"Awe",0.0,0.0,0.0); 
    paintGL(); 
    return 0; 
    } 



    vid initializeGL(){ 
     glShadeModel(GL_SMOOTH); 

     glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     glClearDepth(1.0f); 

     glEnable(GL_DEPTH_TEST); 
     glDepthFunc(GL_LEQUAL); 

     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

     // lighting stuff 
     GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0}; 
     GLfloat diffuse[] = {0.9, 0.9, 0.9, 1.0}; 
     GLfloat specular[] = {0.4, 0.4, 0.4, 1.0}; 
     GLfloat position0[] = {1.0, 1.0, 1.0, 0.0}; 
     glLightfv(GL_LIGHT0, GL_POSITION, position0); 
     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); 
     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); 
     glLightfv(GL_LIGHT0, GL_SPECULAR, specular); 
     GLfloat position1[] = {-1.0, -1.0, -1.0, 0.0}; 
     glLightfv(GL_LIGHT1, GL_POSITION, position1); 
     glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); 
     glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); 
     glLightfv(GL_LIGHT1, GL_SPECULAR, specular); 

     glEnable(GL_LIGHTING); 
     glEnable(GL_LIGHT0); 
     glEnable(GL_LIGHT1); 
     glEnable(GL_COLOR_MATERIAL); 

     /* Draws the Grid*/ 
     drawRGrid(); 
    } 

    void resizeGL(int width, int height){ 
    height = height?height:1; 

    glViewport(0, 0, (GLint)width, (GLint)height); 

    // update projection matrix 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,.10f,200.0f); 

    // modeview matrix is simply identity 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    } 

    void paintGL(){ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    //set camera position using gluLookAt 
    glLoadIdentity(); 
    gluLookAt(0.0f,0.0f,0.0f,0.0f,0.0f,-200.0f,0.0f,1.0f,0.0f); 

    } 


    void doCircle(double x, double y, double radius){ 
    glEnable(GL_BLEND); 
    double y1=y+radius; 
    double x1=x; 
    glBegin(GL_LINE_STRIP); 
    for(double angle=0.0f;angle<=(2.0f*3.14159);angle+=0.01f){ 
     double x2=x+(radius*(float)sin((double)angle)); 
     double y2=y+(radius*(float)cos((double)angle)); 
     glColor3f(1.0,1.0,1.0); //White 
     glVertex2d(x1,y1); 
     y1=y2; 
     x1=x2; 
    } 
    glEnd(); 
    glDisable(GL_BLEND); 
    } 

    void drawRGrid(){ 
    float xCirc = 0; 
    float yCirc = 0; 
    int numCircles = 5; 
    int threesixty = 360; 
    int numLines = 20; 

    //draws my circles 
    for (int i=0; i < numCircles;i++){ 
     doCircle(1.0,1.0,i); 
    } 

    //draws my lines 
    for (int j=0; j < threesixty/numLines;j+= numLines){ 
     // multiply by numCircles to get to extend to 
     // that length 
     drawLines(sin(j)*numCircles,sin(j)*numCircles); 
    } 

    } 

    void drawLines(float xCirc, float yCirc){ 
    glBegin(GL_LINES); 
    glVertex2f(0,0); 
    glVertex2f(xCirc,yCirc); 
    glEnd(); 
    } 



}; 

任何帮助将是巨大的感谢!

+0

的重复[什么是主要的正确申报?](http://stackoverflow.com/questions/4207134/what-is-the-proper- )(它在被问及的时候并不重复,但常见问题已经更新以涵盖这个问题的答案。) – 2010-11-21 06:29:13

回答

6

您已声明main()作为成员函数。

当应用程序启动时调用的main()函数需要是全局名称空间中的非成员函数。

A good introductory C++ book会解释这一点。

+0

我的java通过了,好吧,非常感谢你的支持链接。 – Jim 2010-11-21 04:48:56

+0

@Jim:这就是为什么你应该得到一本很好的入门C++书。 – 2010-11-21 04:50:43

3

您在Solar中声明mainmain应该是一个自由功能,即不包含在一个类中。

1

main无法找到,因为您写的函数被称为Solar::main(事实上,它有一个更好笑的名字)。您需要将其移动到class Solar以下。那么您可能想要将class Solar更改为struct Solar,直到您引入成员变量。最后,你可能要重写main

extern "C" int main (int /* argc */, char *const * /* argv */) { 
    Solar solar; 
    solar.initializeGL(); 
    //Stars Alpha = new Stars(5.0); 
    //Stars *Alpha = new Stars(5.0); 
    //Planets *Awe = new Planets(.6,2,30,"Awe",0.0,0.0,0.0); 
    solar.paintGL(); 
    return 0; 
} 
+0

如果没有成员变量,为什么OP更愿意使用'struct'? – 2010-11-21 05:34:47

+0

它更短,但在其他方面相当于'class {public:...};' – dennycrane 2010-11-21 13:29:05