opengl 对‘glutInit’未定义的引用

KyJason 发布于 2015/11/14 22:59
阅读 3K+
收藏 0

在网上找了一个例子,想运行一下结果出现几个问题

CMakeFiles/mouseGL.dir/mouseGL.cpp.o:在函数‘Display()’中:
mouseGL.cpp:(.text+0x4cf):对‘glutSwapBuffers’未定义的引用
CMakeFiles/mouseGL.dir/mouseGL.cpp.o:在函数‘main’中:
mouseGL.cpp:(.text+0x781):对‘glutInit’未定义的引用
mouseGL.cpp:(.text+0x78b):对‘glutInitDisplayMode’未定义的引用
mouseGL.cpp:(.text+0x79a):对‘glutInitWindowSize’未定义的引用
mouseGL.cpp:(.text+0x7a9):对‘glutInitWindowPosition’未定义的引用
mouseGL.cpp:(.text+0x7b8):对‘glutCreateWindow’未定义的引用
mouseGL.cpp:(.text+0x7d2):对‘glutReshapeFunc’未定义的引用
mouseGL.cpp:(.text+0x7dc):对‘glutDisplayFunc’未定义的引用
mouseGL.cpp:(.text+0x7e6):对‘glutKeyboardFunc’未定义的引用
mouseGL.cpp:(.text+0x7f0):对‘glutMouseFunc’未定义的引用
mouseGL.cpp:(.text+0x7fa):对‘glutMotionFunc’未定义的引用
mouseGL.cpp:(.text+0x7ff):对‘glutMainLoop’未定义的引用
collect2: error: ld returned 1 exit status
make[2]: *** [mouseGL] 错误 1
make[1]: *** [CMakeFiles/mouseGL.dir/all] 错误 2
make: *** [all] 错误 2
整个 程序

#include <stdlib.h>
#include <stdio.h>
#include <math.h> 
#include <GL/glut.h>            /*OpenGL Utility Toolkit*//*该文件已包含了GL.h 和Glu.h*/
 
#define DEG_TO_RAD 0.017453
#define TRUE 1
#define FALSE 0
 
struct POINT                      /*用于记录鼠标位置*/
{
       int x;
       int y;
};
 
struct CAMERA                   /*用于摄像机定位*/
{
       GLfloat   xeye;
       GLfloat yeye;
       GLfloat zeye;
};
 
struct POLAR               /*球坐标*/
{
       float r;                   /*距离r*/
       float alpha;                    /*水平偏角α*/
       float fy;                 /*竖直偏角φ(单位均用角度)*/
};
 
struct POLAR        polar={ 3.0f, 60.0f, 45.0f};          /*初始化球坐标*/
struct CAMERA            camera;                 /*这个摄像机的位置就是球坐标的位置*/
 
struct POINT        oldpt={ -1, -1};                    /*记录鼠标的前一个位置*/
 
int                                l_button_down=FALSE;               /*记录鼠标左键按下的状态*/
 
void Init()                     /*初始化场景*/
{
   glClearColor( 1.0, 1.0, 1.0, 1.0);                   /*将背静设为白色*/
   glColor3f( 0.0, 0.0, 0.5);                /*物体用蓝色*/
}
 
void Reshape(int w, int h)                    /*使随窗口大小改变而改变*/
{
   glViewport(0, 0, w, h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(-6.0, 6.0,-6.0, 6.0,-6.0, 6.0);                   /*定义剪裁区*/
}
 
void Keyboard(unsigned char key, int x, int y)     /*当有键盘消息时会回调该函数*/
{
   switch (key) {
      case 27:                    /*按ESCAPE时退出窗口*/
         exit(0);
         break;
   }
}
 
void Display()               /*在这里绘制图形*/
{
       glClear(GL_COLOR_BUFFER_BIT);
       glMatrixMode(GL_MODELVIEW);
       glLoadIdentity();
       gluLookAt(camera.xeye,camera.yeye,camera.zeye,            /*设定摄像机位置,*/
                                                 /*你所看到的景物将根据摄像机的位置改变而改变,*/
                                                 /*这就是鼠标调整摄像机位置的结果*/
                                   0.0 , 0.0, 0.0,/*这三个参数是摄像机观察的点*/
                                   0.0, 1.0, 0.0);/*这三个参数指定了视图的上方向*/
       glBegin(GL_QUADS);           /*画一个彩色的正方体*/
       /*front*/
              glColor3f( 0.0f, 0.0f, 1.0f);
              glVertex3f(-1.0f,-1.0f, 1.0f);
              glVertex3f( 1.0f,-1.0f, 1.0f);
              glVertex3f( 1.0f, 1.0f, 1.0f);
              glVertex3f(-1.0f, 1.0f, 1.0f);
       /*back*/
              glColor3f( 0.0f, 1.0f, 0.0f);
              glVertex3f(-1.0f,-1.0f,-1.0f);
              glVertex3f(-1.0f, 1.0f,-1.0f);
              glVertex3f( 1.0f, 1.0f,-1.0f);
              glVertex3f( 1.0f,-1.0f,-1.0f);
       /*top*/
              glColor3f( 1.0f, 0.0f, 0.0f);
              glVertex3f(-1.0f, 1.0f,-1.0f);
              glVertex3f(-1.0f, 1.0f, 1.0f);
              glVertex3f( 1.0f, 1.0f, 1.0f);
              glVertex3f( 1.0f, 1.0f,-1.0f);
       /*bottom*/
              glColor3f( 0.0f, 1.0f, 1.0f);
              glVertex3f(-1.0f,-1.0f,-1.0f);
              glVertex3f( 1.0f,-1.0f,-1.0f);
              glVertex3f( 1.0f,-1.0f, 1.0f);
              glVertex3f(-1.0f,-1.0f, 1.0f);
       /*right*/
              glColor3f( 1.0f, 0.0f, 1.0f);
              glVertex3f( 1.0f,-1.0f,-1.0f);
              glVertex3f( 1.0f, 1.0f,-1.0f);
              glVertex3f( 1.0f, 1.0f, 1.0f);
              glVertex3f( 1.0f,-1.0f, 1.0f);
       /*left*/
              glColor3f( 1.0f, 1.0f, 0.0f);
              glVertex3f(-1.0f,-1.0f,-1.0f);
              glVertex3f(-1.0f,-1.0f, 1.0f);
              glVertex3f(-1.0f, 1.0f, 1.0f);
              glVertex3f(-1.0f, 1.0f,-1.0f);
       glEnd();
       glutSwapBuffers();               /*交换前后台缓冲区*/
}
 
                     /*将球坐标转化为直角坐标,并设定为摄像机的位置*/
void SetCamera(GLfloat x, GLfloat y)         /*x,y 是水平方向和竖直方向的改变量*/
{
       GLfloat alpha,fy;                  /*和它的名字一样,不过是单位是弧度*/
       if((polar.fy+y)>5.0f && (polar.fy+y)<175.0f)
       {     /*定义竖直偏角只能在5°到175°之间*/
              polar.alpha += x;                  /*根据鼠标移动的方向设置新的球坐标*/
              polar.fy += y;
 
              if(polar.alpha>360.0f) polar.alpha-=360.0f;
              if(polar.alpha<0.0f) polar.alpha+=360.0f;      /*将水平偏角锁定在0°到360°之间*/
 
              alpha=polar.alpha*DEG_TO_RAD;
              fy=polar.fy*DEG_TO_RAD;               /*角度转弧度*/
              camera.xeye = polar.r * sin(fy) * cos(alpha);       /*极坐标转直角坐标*/
              camera.zeye = polar.r * sin(fy) * sin(alpha);
              camera.yeye = polar.r * cos(fy);                 /*注意:竖直方向的是y轴*/
 
              Display();                     /*每次改变相机位置时重绘*/
              /*当然,我画的是静态的,若景物是动态的,你必须将重绘放在空闲回调函数中*/
       }
}
 
void Mouse(int button, int state, int x, int y)        /*当鼠标按下或拿起时会回调该函数*/
{
   if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
   {
          l_button_down = TRUE;                /*当l_button_down为true时才可改变相机位置*/
          oldpt.x=x;                      /*记录旧坐标,以便移动发生时计算鼠标移动方向*/
          oldpt.y=y;
   }
   if(button == GLUT_LEFT_BUTTON && state == GLUT_UP)
   {
          l_button_down = FALSE;        /*拿起时不能改变摄像机位置*/
   }
}
 
void OnMouseMove(int x, int y)          /*当鼠标移动时会回调该函数*/
{
       if(l_button_down)         /*如果鼠标没有按下则不改变摄像机位置*/
       {
              SetCamera(float(x-oldpt.x),float(oldpt.y-y));       /*根据增量重新设定摄像机位置*/
 
              oldpt.x=x;              /*将当前坐标置为旧坐标*/
              oldpt.y=y;
       }
}
/*若景物是动态的,则使用该函数调用重绘
void Idle()
{
       Display();
}
*/
int main(int argc, char** argv)
{
   glutInit(&argc, argv);             /*初始化GLUT*/
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);          /*设置显示模式(双缓冲)*/
   glutInitWindowSize(400, 400);              /*设定窗口大小*/
   glutInitWindowPosition(100, 100);         /*左上角坐标*/
   glutCreateWindow(argv[0]);           /*创建窗口*/
 
   Init();
   SetCamera(0.0f,0.0f);
   glutReshapeFunc(Reshape);
   glutDisplayFunc(Display);
   glutKeyboardFunc(Keyboard);
   glutMouseFunc(Mouse);
   glutMotionFunc(OnMouseMove);          /*设置各种消息处理函数*/
/*   glutIdleFunc(Idle);*/            /*设置空闲回调函数*/
   glutMainLoop();              /*进入消息循环*/
   return 0;
}
cmake文件

cmake_minimum_required(VERSION 2.8)
project(helloworld)


find_package(OpenCV REQUIRED )
find_package(OpenGL REQUIRED )

include_directories(${OpenCV_INCLUDE_DIR})
include_directories(${OpenGL_INCLUDE_DIR})

link_directories(${OpenCV_LIBRARY_DIR})
link_directories(${OpenGL_LIBRARY_DIR})

add_executable(mouseROI mouseROI.cpp)
target_link_libraries(mouseROI ${OpenCV_LIBS})
target_link_libraries( mouseROI ${OPENGL_LIBRARIES} )
为什么会没有定义?

还有一个问题就是我用opencv定义了一个窗口,使用WINDOW_OPENGL,但是我用opencv的鼠标交互得到的坐标用opengl的代码在图像上输出时坐标却变了。两者的坐标系是否一样,怎么转化?

加载中
0
k
kchr
搜索 freeglut
KyJason
KyJason
这个文件我看过了,没有用
返回顶部
顶部