Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. linking shared library in static built Qt.
Forum Updated to NodeBB v4.3 + New Features

linking shared library in static built Qt.

Scheduled Pinned Locked Moved Unsolved General and Desktop
16 Posts 3 Posters 2.5k Views
  • 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.
  • jsulmJ jsulm

    @samdol said in linking shared library in static built Qt.:

    I tried to use in my project

    Please show how.
    And also tell us what exactly did not work.

    S Offline
    S Offline
    samdol
    wrote on last edited by
    #3

    @jsulm When I created a shared library using Qt-creator with Qt installed by qt-opensource-windows-x86-mingw492-5.6.2.exe, I could get mylib.a and mylib.dll. but when I created a shared library using Qt-creator with static-built Qt, I could get only mylib.a without mylib.dll.
    I don't think I can link the library without .dll. I don't know what did I make mistake.

    jsulmJ 1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #4

      When I created a shared library using Qt-creator with Qt installed by qt-opensource-windows-x86-mingw492-5.6.2.exe, I could get mylib.a and mylib.dll. but when I created a shared library using Qt-creator with static-built Qt, I could get only mylib.a without mylib.dll.

      You're wrong here.
      When you compile static then you will only get a .a
      When you create a shared lib you will get a .dll (the shared lib) and an import lib (.a).

      I don't think I can link the library without .dll

      You don't link against the dll, you link against the static (import) lib .a

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      S 1 Reply Last reply
      4
      • S samdol

        @jsulm When I created a shared library using Qt-creator with Qt installed by qt-opensource-windows-x86-mingw492-5.6.2.exe, I could get mylib.a and mylib.dll. but when I created a shared library using Qt-creator with static-built Qt, I could get only mylib.a without mylib.dll.
        I don't think I can link the library without .dll. I don't know what did I make mistake.

        jsulmJ Offline
        jsulmJ Offline
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #5

        @samdol Do you have to link against shared version? If not simply use the static one.

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        S 1 Reply Last reply
        1
        • Christian EhrlicherC Christian Ehrlicher

          When I created a shared library using Qt-creator with Qt installed by qt-opensource-windows-x86-mingw492-5.6.2.exe, I could get mylib.a and mylib.dll. but when I created a shared library using Qt-creator with static-built Qt, I could get only mylib.a without mylib.dll.

          You're wrong here.
          When you compile static then you will only get a .a
          When you create a shared lib you will get a .dll (the shared lib) and an import lib (.a).

          I don't think I can link the library without .dll

          You don't link against the dll, you link against the static (import) lib .a

          S Offline
          S Offline
          samdol
          wrote on last edited by
          #6

          @Christian-Ehrlicher
          I selected shared(not static) library when I create the library using qt-creator. It seems I get only .a because my Qt is built statically.

          Christian EhrlicherC 1 Reply Last reply
          0
          • jsulmJ jsulm

            @samdol Do you have to link against shared version? If not simply use the static one.

            S Offline
            S Offline
            samdol
            wrote on last edited by
            #7

            @jsulm This is for my practice. My real project using static Qt links statically to MIT third party libraries. but it also has to link dynamically to LGPL third party libraries.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              samdol
              wrote on last edited by
              #8

              I could get both .a and .dll by adding
              CONFIG += shared
              to .pro
              I put the header files to myapp/include directory and
              generated .a and .dll to myapp/lib.
              So I could link the library to myapp, but when I ran myapp,
              it did not pop up widget and gives the following message:

              Starting D:\my\build-myapp-64bit-Release\release\lib_app.exe...
              QWidget: Must construct a QApplication before a QWidget
              D:\my\build-myapp-64bit-Release\release\lib_app.exe exited with code 3

              Another thing strange is that the generated libtestLib.a is 9kb but
              the generated testLib.dll is HUGE 12,892kb even I have only one widget
              derived from QWidget.

              testLib.pro
              QT += widgets
              TARGET = testLib
              TEMPLATE = lib
              DEFINES += TESTLIB_LIBRARY
              SOURCES += widget.cpp
              HEADERS += widget.h
              testlib_global.h
              CONFIG += shared

              testlib_global.h
              #ifndef TESTLIB_GLOBAL_H
              #define TESTLIB_GLOBAL_H
              #include <QtCore/qglobal.h>
              #if defined(TESTLIB_LIBRARY)

              define TESTLIBSHARED_EXPORT Q_DECL_EXPORT

              #else

              define TESTLIBSHARED_EXPORT Q_DECL_IMPORT

              #endif
              #endif // TESTLIB_GLOBAL_H

              widget.h
              #ifndef WIDGET_H
              #define WIDGET_H
              #include <QWidget>
              #include <QDebug>
              #include "testlib_global.h"
              class TESTLIBSHARED_EXPORT Widget : public QWidget
              {
              Q_OBJECT
              public:
              Widget();
              void print();
              };
              #endif // WIDGET_H

              widget.cpp
              #include "widget.h"
              Widget::Widget() : QWidget()
              {
              qDebug()<<"My library runs successfully.";
              }
              void Widget::print()
              {
              qDebug()<<"print() is called.";
              }

              myapp.pro
              greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
              TEMPLATE = app
              TARGET = lib_app
              INCLUDEPATH += $$PWD/include
              LIBS += -L$$PWD/lib -ltestlib
              SOURCES += main.cpp

              main.cpp
              #include <QApplication>
              #include <QWidget>
              #include "widget.h"
              int main(int argc, char *argv[])
              {
              QApplication a(argc, argv);
              Widget w;
              w.resize(100, 100);
              w.show();
              return a.exec();
              }

              1 Reply Last reply
              0
              • S samdol

                @Christian-Ehrlicher
                I selected shared(not static) library when I create the library using qt-creator. It seems I get only .a because my Qt is built statically.

                Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by Christian Ehrlicher
                #9

                @samdol said in linking shared library in static built Qt.:

                because my Qt is built statically.

                Then you can't build a shared lib by default, yes this is correct.

                Another thing strange is that the generated libtestLib.a is 9kb but
                the generated testLib.dll is HUGE 12,892kb even I have only one widget
                derived from QWidget.

                And this is correct too - the static (import) lib only contains your stuff, the shared lib needs the whole Qt code.

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                S 1 Reply Last reply
                2
                • Christian EhrlicherC Christian Ehrlicher

                  @samdol said in linking shared library in static built Qt.:

                  because my Qt is built statically.

                  Then you can't build a shared lib by default, yes this is correct.

                  Another thing strange is that the generated libtestLib.a is 9kb but
                  the generated testLib.dll is HUGE 12,892kb even I have only one widget
                  derived from QWidget.

                  And this is correct too - the static (import) lib only contains your stuff, the shared lib needs the whole Qt code.

                  S Offline
                  S Offline
                  samdol
                  wrote on last edited by
                  #10

                  @Christian-Ehrlicher
                  Thank you for the reply. When I build testLib.dll using Qt-creator with Qt installed by qt-opensource-windows-x86-mingw492-5.6.2.exe, it was only few hundreds kilobytes. But with static built Qt it is 12 MB which I don't understand.

                  On the other hand, in win10 64bit v1803, after linking to the shared library, it did not pop up widget with perplexing message:
                  QWidget: Must construct a QApplication before a QWidge
                  I tried to run it on the other machine which has win 10 64bit v1709, ant it pops up the message "Runtime error..."

                  jsulmJ 1 Reply Last reply
                  0
                  • Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #11

                    @samdol said in linking shared library in static built Qt.:

                    static built Qt it is 12 MB which I don't understand.

                    Again: You shared lib contains all Qt code it needs from your static Qt.

                    Why do you want to use a static Qt at all?

                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                    Visit the Qt Academy at https://academy.qt.io/catalog

                    jsulmJ 1 Reply Last reply
                    2
                    • Christian EhrlicherC Christian Ehrlicher

                      @samdol said in linking shared library in static built Qt.:

                      static built Qt it is 12 MB which I don't understand.

                      Again: You shared lib contains all Qt code it needs from your static Qt.

                      Why do you want to use a static Qt at all?

                      jsulmJ Offline
                      jsulmJ Offline
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #12

                      @Christian-Ehrlicher Small correction: the static lib contains whole Qt :-)

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • S samdol

                        @Christian-Ehrlicher
                        Thank you for the reply. When I build testLib.dll using Qt-creator with Qt installed by qt-opensource-windows-x86-mingw492-5.6.2.exe, it was only few hundreds kilobytes. But with static built Qt it is 12 MB which I don't understand.

                        On the other hand, in win10 64bit v1803, after linking to the shared library, it did not pop up widget with perplexing message:
                        QWidget: Must construct a QApplication before a QWidge
                        I tried to run it on the other machine which has win 10 64bit v1709, ant it pops up the message "Runtime error..."

                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #13

                        @samdol said in linking shared library in static built Qt.:

                        But with static built Qt it is 12 MB which I don't understand

                        Then you should read about static libs first before using them. When using static libs all the stuff from that lib is linked into your app/lib and that's why it is bigger then. This is a fundamental difference between static and shared lib.

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        S 1 Reply Last reply
                        2
                        • jsulmJ jsulm

                          @samdol said in linking shared library in static built Qt.:

                          But with static built Qt it is 12 MB which I don't understand

                          Then you should read about static libs first before using them. When using static libs all the stuff from that lib is linked into your app/lib and that's why it is bigger then. This is a fundamental difference between static and shared lib.

                          S Offline
                          S Offline
                          samdol
                          wrote on last edited by
                          #14

                          @jsulm said in linking shared library in static built Qt.:

                          This is a fundamental difference between static

                          Can I mix to use static and shared library for the same app?
                          About runtime error:
                          I think it maybe mingw version issue: I saw the third party shared library is compiled with Qt5.7 mingw5.3.0. But My app is compiled with Qt5.6.2 mingw4.9.2. If the compiler version should be the same, do I have to whole build Qt5.6.2 with mingw5.3.0 or can I just set mingw5.3.0 in build option in Qt-Creator with Qt built with mingw4.9.2?

                          jsulmJ 1 Reply Last reply
                          0
                          • Christian EhrlicherC Offline
                            Christian EhrlicherC Offline
                            Christian Ehrlicher
                            Lifetime Qt Champion
                            wrote on last edited by
                            #15

                            @samdol said in linking shared library in static built Qt.:

                            Can I mix to use static and shared library for the same app?

                            No, not really - and this questions shows us - just stop with the static stuff, stay with the shared libraries.

                            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                            Visit the Qt Academy at https://academy.qt.io/catalog

                            1 Reply Last reply
                            0
                            • S samdol

                              @jsulm said in linking shared library in static built Qt.:

                              This is a fundamental difference between static

                              Can I mix to use static and shared library for the same app?
                              About runtime error:
                              I think it maybe mingw version issue: I saw the third party shared library is compiled with Qt5.7 mingw5.3.0. But My app is compiled with Qt5.6.2 mingw4.9.2. If the compiler version should be the same, do I have to whole build Qt5.6.2 with mingw5.3.0 or can I just set mingw5.3.0 in build option in Qt-Creator with Qt built with mingw4.9.2?

                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #16

                              @samdol You need Qt built with same compiler - do not mix binaries built with different C++ compilers.

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              2

                              • Login

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