带有 qmake 的 Qt 5.5:链接器无法解析 OpenGL 函数调用
Qt 5.5 with qmake: Linker cannot resolve OpenGL function calls
当使用 Qt 5.5、qmake 和 MSVC 13 编译带有一些基本 OpenGL 函数调用的基本样板 Qt 应用程序时,出现以下链接器错误:
glwidget.obj:-1: error: LNK2019: unresolved external symbol __imp__glClear@4 referenced in function "public: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@UAEXXZ)
glwidget.obj:-1: error: LNK2019: unresolved external symbol __imp__glClearColor@16 referenced in function "public: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@UAEXXZ)
debug\OpenGLApp.exe:-1: error: LNK1120: 2 unresolved externals
我有:
- 指定QT += opengl
- 明确指定 CONFIG += windows(显然 += 控制台禁用 gui 功能)
.pro 文件:
QT += core gui opengl widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets opengl
TARGET = OpenGLApp
TEMPLATE = app
CONFIG += windows
SOURCES += main.cpp\
mainwindow.cpp \
glwidget.cpp
HEADERS += mainwindow.h \
glwidget.h
glwidget.cpp 文件:
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {
}
void GLWidget::initializeGL() {
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
glwidget.h 文件:
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class GLWidget : public QOpenGLWidget {
Q_OBJECT
public:
GLWidget(QWidget *);
void initializeGL();
void resizeGL();
void PaintGL();
};
在另一个几乎相同的测试程序中,我遇到了链接器无法解析 OpenGL 函数调用的相同问题。通过改用 CMake,特别是使用以下 "find_package(OpenGL REQUIRED)" 行,并在 "target_link_libraries" 中添加“${OPENGL_LIBRARIES}”,我能够解决问题:
#Qt5
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
#OpenGL
find_package(OpenGL REQUIRED)
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Gui Qt5::Core Qt5::OpenGL ${OPENGL_LIBRARIES})
因此我怀疑 qmake 无法找到 OpenGL 库,尽管我不确定如何检查以及这可能是什么原因,如果有人能指出我缺少的内容,我将不胜感激.
需要在.pro文件中添加
LIBS += opengl32.lib
如果您使用 Visual Studio 来正确链接 OpenGL 库。
您可以在此处找到更多详细信息:
当使用 Qt 5.5、qmake 和 MSVC 13 编译带有一些基本 OpenGL 函数调用的基本样板 Qt 应用程序时,出现以下链接器错误:
glwidget.obj:-1: error: LNK2019: unresolved external symbol __imp__glClear@4 referenced in function "public: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@UAEXXZ)
glwidget.obj:-1: error: LNK2019: unresolved external symbol __imp__glClearColor@16 referenced in function "public: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@UAEXXZ)
debug\OpenGLApp.exe:-1: error: LNK1120: 2 unresolved externals
我有:
- 指定QT += opengl
- 明确指定 CONFIG += windows(显然 += 控制台禁用 gui 功能)
.pro 文件:
QT += core gui opengl widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets opengl
TARGET = OpenGLApp
TEMPLATE = app
CONFIG += windows
SOURCES += main.cpp\
mainwindow.cpp \
glwidget.cpp
HEADERS += mainwindow.h \
glwidget.h
glwidget.cpp 文件:
#include "glwidget.h"
GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {
}
void GLWidget::initializeGL() {
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}
glwidget.h 文件:
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
class GLWidget : public QOpenGLWidget {
Q_OBJECT
public:
GLWidget(QWidget *);
void initializeGL();
void resizeGL();
void PaintGL();
};
在另一个几乎相同的测试程序中,我遇到了链接器无法解析 OpenGL 函数调用的相同问题。通过改用 CMake,特别是使用以下 "find_package(OpenGL REQUIRED)" 行,并在 "target_link_libraries" 中添加“${OPENGL_LIBRARIES}”,我能够解决问题:
#Qt5
find_package(Qt5Core REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
#OpenGL
find_package(OpenGL REQUIRED)
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Gui Qt5::Core Qt5::OpenGL ${OPENGL_LIBRARIES})
因此我怀疑 qmake 无法找到 OpenGL 库,尽管我不确定如何检查以及这可能是什么原因,如果有人能指出我缺少的内容,我将不胜感激.
需要在.pro文件中添加
LIBS += opengl32.lib
如果您使用 Visual Studio 来正确链接 OpenGL 库。
您可以在此处找到更多详细信息: