Qt项目中对glew方法的未定义引用
Undefined reference to glew methods in a Qt project
我在Qt 5.1.0中使用opengl时遇到了一个严重的问题。我的编译器是MinGW 32位,我使用Windows10 64位。我正在尝试创建一个包含OpenGL小部件的主窗口。在这个OpenGL小部件中,我正在尝试绘制一个三角形。
我已经下载了glew1.9.0(因为glew-2.0.0下载给了我一个空的lib文件夹)。我已经包含了静态库glew32s.lib
(而不是动态库.dll
)。我添加了#define GLEW_STATIC
和#include <gl/glew.h>
。我还在.pro
文件中添加了lib路径和关于要链接的库的信息,以及include路径。
但对于glew.h
中包含的所有函数,我仍然得到了未定义的引用。事实上,我已经注意到,虽然我使用例如glGenBuffers()
,但我收到了一条关于__glewGenBuffers()
的消息。在gl.glew.h
中,我发现了尚未定义的glGenBuffers is defined, calls
__glewGenBuffers'所在的行。
1685 #define glGenBuffers GLEW_GET_FUN(__glewGenBuffers)
14376 GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers;
那么,问题可能是__glewGenBuffers
被调用了,但在glew.h
中还没有定义吗?我是说,我是不是错过了什么?我已经尝试了两天了,我已经尝试过类似帖子中发布的所有内容,但我找不到解决方案。
以下是代码的一个小但有代表性的部分:
glwidget.cpp:
#define GLEW_STATIC
#include <gl/glew.h>
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent) :
QGLWidget(parent)
{
}
extern "C" void GLWidget::initializeGL()
{
glewInit();
glClearColor(0, 1, 0, 1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
GLfloat verts[] =
{
+0.0f, +1.0f,
-1.0f, -1.0f,
+1.0f, -1.0f,
};
GLuint myBufferID;
glGenBuffers(1, &myBufferID);
glBindBuffer(GL_ARRAY_BUFFER, myBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
}
void GLWidget::resizeGL(int w, int h)
{
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
.pro文件:
QT += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = New_Beam
TEMPLATE = app
SOURCES += main.cpp
mainwindow.cpp
glwidget.cpp
HEADERS += mainwindow.h
glwidget.h
../../../../../Qt/Qt5.3.2/glew-1.9.0/include/GL/glew.h
FORMS += mainwindow.ui
win32: LIBS += -L"C:/Qt/Qt5.3.2/glew-1.9.0/lib" -lglew32s -lopengl32
INCLUDEPATH += C:/Qt/Qt5.3.2/glew-1.9.0/include
DEPENDPATH += C:/Qt/Qt5.3.2/glew-1.9.0/include
消息是:
对'__glewGenBuffers'的未定义引用
我使用过的所有glew函数都是一样的。欢迎回答。
如果您使用Qt,您应该而不是使用glew:因为Qt为OpenGL函数提供封装,所以它充其量是无用的。因此,如果你真的想"手动"完成这项工作,请使用像QOpenGLBuffer
或QOpenGLFunctions
这样的Qt类:
class GLWidget : public QGLWidget, protected QOpenGLFunctions
{
// ...
};
以及实现:
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent) :
QGLWidget(parent)
{
}
void GLWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0, 1, 0, 1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
GLfloat verts[] =
{
+0.0f, +1.0f,
-1.0f, -1.0f,
+1.0f, -1.0f,
};
GLuint myBufferID;
glGenBuffers(1, &myBufferID);
glBindBuffer(GL_ARRAY_BUFFER, myBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
}
void GLWidget::resizeGL(int w, int h)
{
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
为了完全回答您的问题,您的"未定义引用"错误可能是由为MSVC而非MinGW编译的glew包中提供的glew32s.lib
引起的。
除非你确定在你的项目中使用与编译依赖项相同的编译器,否则最好的方法是从源代码编译你自己的版本。
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用