Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode'
-
@Christian-Ehrlicher said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
Why? Did you read my post, the so post and what I suggested?
I tried removing this line as an experiment to see if there would be more errors, but the number of errors remained the same. This is some kind of mystic. It's as if the linker is ignoring -lopengl32
-
@8Observer8 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
Maybe should I include -opengl (or something like this) to config command before the static build?
configure -prefix "C:\Qt6.2.0_Static" -static -static-runtime -release -opensource -confirm-license -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -sql-odbc -sql-sqlite -nomake tools -nomake examples -nomake tests -skip qttools -skip qtquick3d -skip qt5compat -skip qtquicktimeline -skip qtwebengine -skip qtactiveqt -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtimageformats -skip qtlottie -skip qtnetworkauth -skip qtremoteobjects -skip qtvirtualkeyboard -skip qtserialbus -skip qtserialport -skip qtwebchannel -skip qtwebview -skip qtwayland -skip qtscxml -skip qtmqtt -skip qtopcua -skip qtsvg -skip qtdoc -skip qttranslations
Here is -opengl
-
@Christian-Ehrlicher said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
Why? Did you read my post, the so post and what I suggested?
Yes, I did. For example, I tried this:
In the linker, at Windows, MinGW: -lglew32 -lglfw3 -lopengl32 -lglu32 -lgdi32
But I do not use GLFW and GLEW. I tried these keys:lglu32 -lgdi32
. I made a simple example in OpenGL. It compiles without errors for dynamic version of Qt 6.2.0 (both: for Debug and for Release builds) but it does not compile for static release only. Errors:qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode' qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glLoadIdentity' qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glOrtho' qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glLoadMatrixf'
pro
QT += core gui openglwidgets win32: LIBS += -lopengl32 -lglu32 -lgdi32
main.cpp
#include <QtWidgets/QApplication> #include <QtOpenGLWidgets/QOpenGLWidget> #include <QtGui/QOpenGLFunctions> class Widget : public QOpenGLWidget, QOpenGLFunctions { private: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.3f, 0.3f, 0.3f, 1.f); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
-
What else should I try?
-
I tried putting -lopengl32 at the end of the line:
win32: LIBS += -lglu32 -lgdi32 -lopengl32
But:
-
I tried to create a question on StackOverflow: Failed to build OpenGL project with static Qt 6.2.0 but my question was closed as duplicate:
This question already has answers here:
What is an undefined reference/unresolved external symbol error and how do I fix it? (38 answers)If anyone encounters this problem and solves it, then please write here how you solved this problem. I did everything I could.
-
@fxr65 I think -lopengl32 references to "opengl32.dll". I tried to copy "opengl32.dll" from "C:\Windows\System32" to my working directory:
I added -L$$PWD to pro file:
QT += core gui openglwidgets win32: LIBS += -L$$PWD -lopengl32 CONFIG += c++11 SOURCES += \ main.cpp
But I see the same errors:
-
I have Windows 10 64 bit and Qt 6.2.0 MingGW 64 bit. I think in this case I should copy "opengl32.dll" from the "C:\Windows\SysWOW64" folder to my project directory. I tried it but I have the same errors as above.
-
@8Observer8 I think you should get opengl32.lib for linker instead of dll. The dll for runtime depends on your app. In case your app is 32bit the dll is in syswow64 and for a 64bit app the dll is in system32. But you do not have to copy the dlls, as all system folders are in path.
-
@fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
I think you should get opengl32.lib for linker instead of dll.
In my case it must be "libopengl.a" because I use MinGW instead of MSVC. But where to find "libopengl.a"? Why does my example work for dynamic Qt and it does not work for static Qt?
-
@8Observer8 I use also mingw for compilation on a W10. Last week I also struggled to get a library recognized by the linker. After setting L and l it worked. libopengl.a is on linux systems, but as you are on W10 you need opengl32.lib. You can find the lib inside the windows sdk.
See https://stackoverflow.com/questions/22231740/opengl32-lib-not-linking-properly -
@fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
libopengl.a is on linux systems, but as you are on W10 you need opengl32.lib
I thought that MinGW uses the
.a
extension only. It compiles all libraries to '.a'. I tried to findlibopengl32.a
hereC:\Qt6\6.2.0\mingw81_64\lib
but I didn't find it.@fxr65 I found OpenGL32.lib in this folder:
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64
:
I copied it to my project directory:
But it doesn't work:
QT += core gui openglwidgets win32: LIBS += -L$$PWD -lopengl32 CONFIG += c++11 SOURCES += \ main.cpp
main.cpp
#include <QtWidgets/QApplication> #include <QtOpenGLWidgets/QOpenGLWidget> #include <QtGui/QOpenGLFunctions> class Widget : public QOpenGLWidget, QOpenGLFunctions { private: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.3f, 0.3f, 0.3f, 1.f); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
-
On my Qt 5.12 this compiles, links and runs:
opengl.proQT += core gui widgets win32: LIBS += -L$$PWD -lopengl32 CONFIG += c++11 SOURCES += \ main.cpp
main.cpp
#include <QtWidgets/QApplication.h> #include <QtWidgets/QOpenGLWidget.h> #include <QtGui/QOpenGLFunctions.h> class Widget : public QOpenGLWidget, QOpenGLFunctions { private: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.3f, 0.3f, 0.3f, 1.f); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT); } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
Also this compiles, links and runs:
opengl2.proQT += core gui widgets win32: CONFIG += c++11 SOURCES += \ main.cpp \ widget.cpp HEADERS += \ widget.h
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QtWidgets/QOpenGLWidget> #include <QtGui/QOpenGLFunctions> class Widget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private: void initializeGL() override; void paintGL() override; void resizeGL(int w, int h) override; }; #endif // WIDGET_H
widget.cpp
#include "widget.h" Widget::Widget(QWidget *parent) : QOpenGLWidget(parent) { resize(500, 500); setWindowTitle("Qt6 C++, OpenGL ES 2.0"); } Widget::~Widget() { } void Widget::initializeGL() { initializeOpenGLFunctions(); glClearColor(0.2f, 0.2f, 0.2f, 1.0f); } void Widget::paintGL() { glClear(GL_COLOR_BUFFER_BIT); } void Widget::resizeGL(int w, int h) { glViewport(0, 0, w, h); }
main.cpp
#include "Widget.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
-
@fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
On my Qt 5.12 this compiles, links and runs
Yes, Qt 5.15.2 Static works for me too. The problem is only with Qt 6.2.0
-
@8Observer8 It seems I can't assist further as it compiles, links and runs on my 6.3.1. The second sample opengl2 did also compile and run after adding "win32: LIBS += -L$$PWD -lopengl32".
-
@8Observer8
Since @fxr65 says it all works under 6.3.1 the first thing would be for you check whether that does work for you too. That should clarify whether it is a Qt issue or an individual build issue. -
Okay, later maybe I will try to build latest Qt with the same configuration options as for Qt 6.2.0. But that might happen in a few months or next year because building with dynamic dlls is now preferred for me because it doesn't violate the LGPL license the way it makes building Qt static. Perhaps I will do it for the experiment, but I will not use a static assembly, so as not to violate the LGPL license.
-
@8Observer8
Then why can't you just give up on static now and go with the dynamic which you say already works and doesn't have all this heartache...? Anyway, up to you. -
@JonB said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode':
Then why can't you just give up on static now and go with the dynamic which you say already works and doesn't have all this heartache...?
I already did it. I just leave here the links to the installed Qt 6.2.0 and the static build for it:
- Qt6.2.0_MinGW_8.1.0_64bit.zip (942 MB)
- Qt6.2.0_Static.zip (194)
But be aware that using static Qt violates the LGPL license. You can use static Qt under the GPL license, but you must disclose the source code for your product, or for a commercial Qt license.