【问题标题】:OpenGL in Ubuntu (C Language) saying things are undeclaredUbuntu(C语言)中的OpenGL说事情未声明
【发布时间】:2014-04-02 22:31:58
【问题描述】:

所以我刚开始学习 OpenGL,我正在使用 C 语言在 Ubuntu 上学习。

我已经从我的讲师笔记中做了一些例子,他们工作了,但是这个给了我错误。

callbackexample.c: In function ‘main’:
callbackexample.c:17:18: error: ‘displays’ undeclared (first use in this function)
callbackexample.c:17:18: note: each undeclared identifier is reported only once for each     function it appears in

对于我文件中的每个方法,依此类推。 我逐字逐句地按照他的笔记进行操作,我得到了这个,所以我不确定出了什么问题。

#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>

#define DEG_TO_RAD 0.017453

int singleb, doubleb;   //window ids
GLfloat theta = 0.0;

int main(int argc, char **argv){

glutInit(&argc, argv);

//create single buffered window
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
singleb = glutCreateWindow("single_buffered");
glutDisplayFunc(displays);
glutReshapeFunc(myReshape);
glutIdleFunc(spinDisplay);
glutMouseFunc(mouse);
glutKeyboardFunc(mykey);

//create double buffered window
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(400,0); //create window to the right
doubleb = glutCreateWindow("double_buffered");
glutDisplayFunc(displayd);
glutReshapeFunc(myReshape);
glutIdleFunc(spinDisplay);
glutMouseFunc(mouse);
glutCreateMenu(quit_menu);
glutAddMenuEntry("quit", 1);
glutAttachMenu(GLUT_RIGHT_BUTTON);

glutMainLoop();
}


void displays() {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
    glVertex2f ( cos(DEG_TO_RAD * theta),
            sin(DEG_TO_RAD * theta));
    glVertex2f ( -sin(DEG_TO_RAD * theta),
            cos(DEG_TO_RAD * theta));
    glVertex2f ( -cos(DEG_TO_RAD * theta),
            -sin(DEG_TO_RAD * theta));
    glVertex2f ( sin(DEG_TO_RAD * theta),
            -cos(DEG_TO_RAD * theta));

glEnd();
glFlush();
}

这只是 main 方法的一些代码,以及我得到错误的第一个方法。通过未声明,我猜这意味着方法未声明,但我遵循了他的代码,所以我不确定

【问题讨论】:

    标签: c opengl ubuntu gcc undeclared-identifier


    【解决方案1】:

    在声明之前,您尝试在 main 函数中使用 displays 方法。您需要将整个函数移到主函数之前,或者将存根添加到顶部:

    void displays();
    
    int main(int argc, char **argv){
       ...
    }
    
    void displays(){
       ...
    }
    

    C 会按照它看到的顺序解析所有内容 - 您不能使用尚未完整声明的方法,或者至少已声明它将在某个时候存在。

    关于您的 cmets: 你得到的 cannot find -l* 东西意味着你要么没有安装 OpenGL 的开发库,要么设置得很奇怪——这意味着它找不到要链接的库文件。

    此外,mykey 问题意味着您要么没有声明 mykey 函数,要么没有按照原型声明它:

    void mykey(unsigned char key, int x, int y) 
    

    【讨论】:

    • 啊,谢谢。我得到另一个编译提示警告:从不兼容的指针类型传递 glutKeyboardFunc 的参数 1 [默认启用] 此外,当我使用以下命令进行编译时,它说它找不到 -lgl 或 -lglu:callbackexample.c -o callbackexample -lgl -lglu -lm - lX11
    • 如果有效,请考虑接受答案。还更新了您的其他问题的答案。
    • 是的,谢谢 :) 我怎样才能找到 -lgl 和 -lglu?我用谷歌搜索了它们,但看不到任何关于它们的信息另外,在我的讲师笔记中,他将 mykey 定义为 void mykey(int key) 所以我不知道该怎么处理它?
    • 只需添加这两个int xint y 作为参数,这应该使它匹配glutKeyboardFunc 正在检查的原型。或者,这可能是第一个问题的副产品 - 您的系统上可能没有旧版本的 Glut。
    • 是的,它修复了关键错误,但我仍然得到 -lgl 和 -lglu 错误。我在 ubuntu 中,当我尝试更新时,它说我拥有所有内容的最新版本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多