error: undefined reference to `gluPerspective@32‘ error: undefined reference to `gluLookAt@72‘ 的解决办法

     记得以前老师上课讲过,在做设备尤其是重要设备时,如果调试过程中出现故障,不仅要解决故障,还要做到故障重现。以上两个问题其实是一个问题,一个芝麻大的问题,困扰了我一周,让我想起那句熟悉的话:出来混迟早是要还的。

    问题出现:使用Qt5.9.6创建一个类,公共继承QOpenGLWidget。

加载了freeglut库,链接了.a链接库文件,将freeglut.dll放入生成的exe的文件夹

LIBS += -L$$PWD\lib -lfreeglut

 

包含了头文件

#include "glut.h"
#include "GL/gl.h"
#include "GL/glu.h"

重写三个函数

void Widget::initializeGL()
{
    qDebug()<<tr("初始化窗口");
    initializeOpenGLFunctions();
 
    glClearColor(255,0,0,0.5);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
}
 
void Widget::paintGL()
{
    qDebug()<<tr("开始绘图");
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0,0,5,0,0,0,0,1,0);
 
    glColor3f(1,0,0);
 
//    glutWireSphere(1,30,30);
}
 
void Widget::resizeGL(int w, int h)
{
    qDebug()<<tr("窗口尺寸改变");
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,(float)w/h,0.01,100.0);
 
    update();
}

运行,这时候问题来了:

error: undefined reference to `gluPerspective@32' error: undefined reference to `gluLookAt@72' 

我基本上查遍了网上所有的相关问题,在此总结一下,以方便读者大人查找:

情况1:Qt5.2版本上出现gluPerspective不能用,只要包含<GL/glu.h>即可

情况2:认为是lib文件没有链接进去,链接进去即可(废话)。做法:将对应lib文件或者.a文件在.pro文件中

情况3:认为是dll文件没有载入,做法:将dll文件放到生成的exe文件的所在文件夹中。

如果以上还没有解决你的问题,那恭喜你和我一样都是被百度经验骗了的小白。

情况4:仔细想一想,gluPerspective和gluLookAt的声明在GL/glu.h中,它们是mingW自带的函数,所以和glut没有半毛钱关系,是因为你在配置mingW的时候根本没有在环境变量中添加mingW中这两个函数的链接库路径,导致gluPerspective和gluLookAt只有声明没有reference,自己配置环境变量 LIBRART_PATH。

    在mingW文件夹中搜索libglut.a和libglut32.a,发现他们两个都在D:\Qt\Qt596\Tools\mingw530_32\i686-w64-mingw32\lib\这个路径下,配置环境变量在LIBRAR_PATH中加入该路径,回到Qt中,在.pro文件中加入

    

LIBS += -lopengl32
LIBS += -lglu32

    opengl32库和libglut32缺一不可。

    这时候有可能读者想问为什么链接libglu.a文件文件名不需要lib直接写glu就可以呢……我只能说不知道,我个人推断可能是linux的固定用法,可能开源的东西都一个路子下来的。

    至于前面的-l也是固定用法,-l必须紧挨着文件名,另外不需要写文件后缀名.a。

    另外其实你也可以不配置环境变量直接从mingW中复制出libglu.a文件到存放源代码(.h和.cpp)的文件夹内,将刚才两行代码加上-L:

 

LIBS += -L -lopengl32
LIBS += -L -lglu32

-L表示当前目录下,这样就可以不配置环境变量。

    以上总结了出现没有函数参考的四种可能性,可以说是博主一周的血泪史,完完全全是个小毛病,以前配置mingW的时候也配了,但是重装完系统再配的时候就过于信任百度经验,只配了一个mingW的bin可执行文件路径,头文件路径和链接库路径没有配置,其实搜索一下mingW下lib文件夹里就有一个libglu32.a,这毫无疑问就是glu.h中函数的reference,so……

    出来混迟早是要还的,不理解的东西迟早要给你下个绊。

PS.我虽然没有亲自试,但是glut和freeflut应该是一样的,虽然使用上确实差了几行代码,但使用上应该就这几个问题了,我用一周的时间验证了一句话,望各位读者别走博主的老路,依然存在问题的读者可以在评论中留言,我会尽量回复。

    博主我的文章我一般定期都会看一下,看到错误都会改过来,以免误人子弟,望各位读者看到错误务必指出,谢谢大家。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值