Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. General talk
  3. Qt 6
  4. Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode'
Forum Updated to NodeBB v4.3 + New Features

Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to `__imp_glMatrixMode'

Scheduled Pinned Locked Moved Unsolved Qt 6
34 Posts 6 Posters 7.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • 8Observer88 Offline
    8Observer88 Offline
    8Observer8
    wrote on last edited by 8Observer8
    #17

    What else should I try?

    1 Reply Last reply
    0
    • 8Observer88 Offline
      8Observer88 Offline
      8Observer8
      wrote on last edited by 8Observer8
      #18

      I tried putting -lopengl32 at the end of the line: win32: LIBS += -lglu32 -lgdi32 -lopengl32

      But:

      a640349d-cf98-4f39-af5b-cff441c62b82-image.png

      1 Reply Last reply
      0
      • 8Observer88 Offline
        8Observer88 Offline
        8Observer8
        wrote on last edited by 8Observer8
        #19

        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.

        1 Reply Last reply
        0
        • F Offline
          F Offline
          fxr65
          wrote on last edited by fxr65
          #20

          Probably you have to add the path to the libraries like this (in case the libs are in your project working dir):
          LIBS += -L$$PWD -l<blah>
          At least this helped me, as I had to add a lib to my project.

          1 Reply Last reply
          0
          • 8Observer88 Offline
            8Observer88 Offline
            8Observer8
            wrote on last edited by 8Observer8
            #21

            @fxr65 I think -lopengl32 references to "opengl32.dll". I tried to copy "opengl32.dll" from "C:\Windows\System32" to my working directory:

            3cfe0235-491d-43ed-821a-59e58ab64178-image.png

            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:

            153ba0e9-eb67-49ad-9343-bbc624aaa645-image.png

            1 Reply Last reply
            0
            • 8Observer88 Offline
              8Observer88 Offline
              8Observer8
              wrote on last edited by 8Observer8
              #22

              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.

              F 1 Reply Last reply
              0
              • 8Observer88 8Observer8

                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.

                F Offline
                F Offline
                fxr65
                wrote on last edited by fxr65
                #23

                @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.

                1 Reply Last reply
                0
                • 8Observer88 Offline
                  8Observer88 Offline
                  8Observer8
                  wrote on last edited by 8Observer8
                  #24

                  @fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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?

                  F 1 Reply Last reply
                  0
                  • 8Observer88 8Observer8

                    @fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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?

                    F Offline
                    F Offline
                    fxr65
                    wrote on last edited by fxr65
                    #25

                    @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

                    8Observer88 1 Reply Last reply
                    1
                    • F fxr65

                      @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

                      8Observer88 Offline
                      8Observer88 Offline
                      8Observer8
                      wrote on last edited by
                      #26

                      @fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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 find libopengl32.a here C:\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:
                      8a5f3232-529c-4630-9dac-b18f6d988a3b-image.png

                      I copied it to my project directory:

                      b6fbd5f7-32d5-446b-a7ea-ba33f574ef62-image.png

                      But it doesn't work:

                      f42deef1-4576-454d-bb66-32c1001e1f37-image.png

                      QtStaticOpenGL.pro

                      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();
                      }
                      
                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        fxr65
                        wrote on last edited by
                        #27

                        On my Qt 5.12 this compiles, links and runs:
                        opengl.pro

                        QT += 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.pro

                        QT += 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();
                        }
                        
                        8Observer88 1 Reply Last reply
                        0
                        • F fxr65

                          On my Qt 5.12 this compiles, links and runs:
                          opengl.pro

                          QT += 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.pro

                          QT += 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();
                          }
                          
                          8Observer88 Offline
                          8Observer88 Offline
                          8Observer8
                          wrote on last edited by 8Observer8
                          #28

                          @fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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

                          F JonBJ 2 Replies Last reply
                          0
                          • 8Observer88 8Observer8

                            @fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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

                            F Offline
                            F Offline
                            fxr65
                            wrote on last edited by
                            #29

                            @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".

                            1 Reply Last reply
                            1
                            • 8Observer88 8Observer8

                              @fxr65 said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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

                              JonBJ Online
                              JonBJ Online
                              JonB
                              wrote on last edited by JonB
                              #30

                              @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.

                              1 Reply Last reply
                              1
                              • 8Observer88 Offline
                                8Observer88 Offline
                                8Observer8
                                wrote on last edited by
                                #31

                                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.

                                JonBJ 1 Reply Last reply
                                0
                                • 8Observer88 8Observer8

                                  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.

                                  JonBJ Online
                                  JonBJ Online
                                  JonB
                                  wrote on last edited by
                                  #32

                                  @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.

                                  8Observer88 1 Reply Last reply
                                  0
                                  • JonBJ JonB

                                    @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.

                                    8Observer88 Offline
                                    8Observer88 Offline
                                    8Observer8
                                    wrote on last edited by 8Observer8
                                    #33

                                    @JonB said in Qt6 OpenGL Static Release. Error: qopenglpaintengine.cpp:-1: error: undefined reference to &#x60;__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.

                                    1 Reply Last reply
                                    0
                                    • P Offline
                                      P Offline
                                      PythonDuncan
                                      wrote on last edited by
                                      #34

                                      I also had this issue today, I followed https://medium.com/swlh/setting-opengl-for-windows-d0b45062caf to install opengl/glew/freeglut and added win32: LIBS += -lfreeglut -lglew32 -lopengl32 in the .pro file. Now everything is working.
                                      PS, I strongly recommend to install libs via https://www.msys2.org/. It's quite simple and convenient.

                                      1 Reply Last reply
                                      1

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved