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. Inconsistent dll linkage

Inconsistent dll linkage

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 5 Posters 11.4k Views 2 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.
  • SGaistS SGaist

    Did you adjust the define value when changing the header ?

    D Offline
    D Offline
    Defohin
    wrote on last edited by
    #11

    @SGaist Yes, I did, both the files are exactly equal, the only thing that changes is CORE_LIBRARY and PLUGINMANAGER_LIBRARY, and they are both defined on their related pro files. I just can't use the header from one library on the other one and these errors happen.

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #12

      What do you mean by you can't use the header ? What exactly goes wrong ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      D 1 Reply Last reply
      0
      • SGaistS SGaist

        What do you mean by you can't use the header ? What exactly goes wrong ?

        D Offline
        D Offline
        Defohin
        wrote on last edited by Defohin
        #13

        @SGaist I get the errors mentioned above about inconsistent dll linkage.

        I'm going to post the entire working code and then I will post the change so you can see what is going on.

        Here is the link to download the entire project: download

        That is how the structure looks like:

        |-- myproject
            |-- myproject.pro
            |-- core
            |   |-- core.pro
            |   |-- core_global.hpp
            |-- myproject
            |   |-- main.cpp
            |   |-- myproject.pro
            |   |-- myprojectwindow.cpp
            |   |-- myprojectwindow.hpp
            |-- pluginmanager
            |   |-- abstractplugin.cpp
            |   |-- abstractplugin.hpp
            |   |-- plugininterface.hpp
            |   |-- pluginmanager.cpp
            |   |-- pluginmanager.hpp
            |   |-- pluginmanager.pro
            |   |-- pluginmanager_global.hpp
            |-- plugins
                |-- plugins.pro
                |-- pluginfoo
                    |-- pluginfoo.cpp
                    |-- pluginfoo.hpp
                    |-- pluginfoo.json
                    |-- pluginfoo.pro
        

        myproject.pro

        TEMPLATE = subdirs
        SUBDIRS  = core \
                   pluginmanager \
                   plugins \
                   myproject
        CONFIG  += ordered
        

        core.pro

        QT      += core
        TARGET   = core
        TEMPLATE = lib
        DEFINES += CORE_LIBRARY
        
        DESTDIR  = $$OUTPWD/bin
        
        HEADERS += core_global.hpp
        

        core_global.hpp

        #ifndef CORE_GLOBAL_HPP
        #define CORE_GLOBAL_HPP
        
        #include <QtCore/qglobal.h>
        
        #if defined(CORE_LIBRARY)
        #  define MYPROJECT_EXPORT Q_DECL_EXPORT
        #else
        #  define MYPROJECT_EXPORT Q_DECL_IMPORT
        #endif
        
        #endif // CORE_GLOBAL_HPP
        

        main.cpp

        #include "myprojectwindow.hpp"
        #include <QApplication>
        
        int main(int argc, char *argv[])
        {
            QApplication application(argc, argv);
        
            MyProjectWindow window;
            window.show();
        
            return application.exec();
        }
        

        myproject.pro

        QT      += core gui widgets xml network
        TARGET   = myproject
        TEMPLATE = app
        DEFINES += QT_DEPRECATED_WARNINGS
        DEFINES += MYPROJECT_LIBRARY
        
        INCLUDEPATH += ../core ../pluginmanager
        DESTDIR      = $$OUTPWD/bin
        LIBS        += -L$$OUTPWD/bin -lcore -lpluginmanager
        
        HEADERS   += myprojectwindow.hpp
        SOURCES   += main.cpp \
                     myprojectwindow.cpp
        

        myprojectwindow.cpp

        #include "myprojectwindow.hpp"
        
        MyProjectWindow::MyProjectWindow(QWidget *parent) : QMainWindow(parent)
        {
        
        }
        

        myprojectwindow.hpp

        #ifndef MYPROJECTWINDOW_HPP
        #define MYPROJECTWINDOW_HPP
        
        #include <QMainWindow>
        
        class MyProjectWindow : public QMainWindow
        {
            Q_OBJECT
        
        public:
            MyProjectWindow(QWidget *parent = 0);
        };
        
        #endif // MYPROJECTWINDOW_HPP
        

        abstractplugin.cpp

        #include "abstractplugin.hpp"
        

        abstractplugin.hpp

        #ifndef ABSTRACTPLUGIN_HPP
        #define ABSTRACTPLUGIN_HPP
        
        #include "plugininterface.hpp"
        
        class MYPROJECT_EXPORT AbstractPlugin : public QObject, public PluginInterface
        {
            Q_OBJECT
            Q_INTERFACES(PluginInterface)
        };
        
        #endif // ABSTRACTPLUGIN_HPP
        

        plugininterface.hpp

        #ifndef PLUGININTERFACE_HPP
        #define PLUGININTERFACE_HPP
        
        #include "pluginmanager_global.hpp"
        #include <QObject>
        
        class MYPROJECT_EXPORT PluginInterface
        {
        public:
            virtual ~PluginInterface() {}
        };
        
        #define PluginInterface_iid "PluginInterface/1.0"
        
        Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)
        
        #endif // PLUGININTERFACE_HPP
        

        pluginmanager.cpp

        #include "pluginmanager.hpp"
        
        PluginManager::PluginManager(QObject *parent) : QObject(parent)
        {
        
        }
        

        pluginmanager.hpp

        #ifndef PLUGINMANAGER_HPP
        #define PLUGINMANAGER_HPP
        
        #include "pluginmanager_global.hpp"
        #include <QObject>
        
        class MYPROJECT_EXPORT PluginManager : public QObject
        {
            Q_OBJECT
        
        public:
            explicit PluginManager(QObject *parent = 0);
        };
        
        #endif // PLUGINMANAGER_HPP
        

        pluginmanager.pro

        QT      += core
        TARGET   = pluginmanager
        TEMPLATE = lib
        DEFINES += PLUGINMANAGER_LIBRARY
        
        INCLUDEPATH += ../core
        DESTDIR      = $$OUTPWD/bin
        
        SOURCES += abstractplugin.cpp \
                   pluginmanager.cpp
        HEADERS += pluginmanager_global.hpp \
                   abstractplugin.hpp \
                   pluginmanager.hpp \
                   plugininterface.hpp
        

        pluginmanager_global.hpp

        #ifndef PLUGINMANAGER_GLOBAL_HPP
        #define PLUGINMANAGER_GLOBAL_HPP
        
        #include <QtCore/qglobal.h>
        
        #if defined(PLUGINMANAGER_LIBRARY)
        #  define MYPROJECT_EXPORT Q_DECL_EXPORT
        #else
        #  define MYPROJECT_EXPORT Q_DECL_IMPORT
        #endif
        
        #endif // PLUGINMANAGER_GLOBAL_HPP
        

        plugins.pro

        TEMPLATE = subdirs
        SUBDIRS  = pluginfoo
        

        pluginfoo.cpp

        #include "pluginfoo.hpp"
        

        pluginfoo.hpp

        #ifndef PLUGINFOO_HPP
        #define PLUGINFOO_HPP
        
        #include "abstractplugin.hpp"
        
        class PluginFoo : public AbstractPlugin
        {
            Q_OBJECT
            Q_PLUGIN_METADATA(IID PluginInterface_iid FILE "pluginfoo.json") \
            Q_INTERFACES(PluginInterface)
        };
        
        #endif // PLUGINFOO_HPP
        

        pluginfoo.json

        {}
        

        pluginfoo.pro

        QT          += core gui
        TARGET       = pluginfoo
        TEMPLATE     = lib
        CONFIG      += plugin
        DEFINES     += QT_DEPRECATED_WARNINGS
        
        INCLUDEPATH += ../../core ../../pluginmanager
        DESTDIR      = $$OUTPWD/bin/plugins
        LIBS        += -L$$OUTPWD/bin -lcore -lpluginmanager
        
        SOURCES     += pluginfoo.cpp \
                       pluginfoo.cpp
        HEADERS     += pluginfoo.hpp \
                       pluginfoo.hpp
        DISTFILES   += pluginfoo.json
        

        The error happens if I change this:

        plugininterface.hpp

        from:

        #include "pluginmanager_global.hpp"

        to:

        #include "core_global.hpp"

        debug\moc_abstractplugin.cpp:56: warning: C4273: 'AbstractPlugin::qt_static_metacall': inconsistent dll linkage

        debug\moc_abstractplugin.cpp:63: warning: C4273: 'staticMetaObject': inconsistent dll linkage

        debug\moc_abstractplugin.cpp:63: error: C2491: 'AbstractPlugin::staticMetaObject': definition of dllimport static data member not allowed

        debug\moc_abstractplugin.cpp:70: warning: C4273: 'AbstractPlugin::metaObject': inconsistent dll linkage

        debug\moc_abstractplugin.cpp:75: warning: C4273: 'AbstractPlugin::qt_metacast': inconsistent dll linkage

        debug\moc_abstractplugin.cpp:87: warning: C4273: 'AbstractPlugin::qt_metacall': inconsistent dll linkage

        Yes, I tried qmake but it doesn't work either.

        1 Reply Last reply
        0
        • D Offline
          D Offline
          Defohin
          wrote on last edited by
          #14

          Anyone knows how to solve this?

          1 Reply Last reply
          0
          • SGaistS Offline
            SGaistS Offline
            SGaist
            Lifetime Qt Champion
            wrote on last edited by
            #15

            If you want to use the same export macros everywhere you also have to modify the DEFINES everywhere.

            Interested in AI ? www.idiap.ch
            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

            D 1 Reply Last reply
            0
            • SGaistS SGaist

              If you want to use the same export macros everywhere you also have to modify the DEFINES everywhere.

              D Offline
              D Offline
              Defohin
              wrote on last edited by
              #16

              @SGaist I tried what you said and it worked. But I have a question, do you think that it's right doing that way? I don't want to be repeating code as I was doing. Is there a better way or it's just fine?

              1 Reply Last reply
              0
              • SGaistS Offline
                SGaistS Offline
                SGaist
                Lifetime Qt Champion
                wrote on last edited by
                #17

                Having a per library global header with the export macros even if it seems redundant is cleaner.

                Interested in AI ? www.idiap.ch
                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                D 1 Reply Last reply
                1
                • SGaistS SGaist

                  Having a per library global header with the export macros even if it seems redundant is cleaner.

                  D Offline
                  D Offline
                  Defohin
                  wrote on last edited by
                  #18

                  @SGaist Thank you, I'll keep the original structure then.

                  1 Reply Last reply
                  0
                  • O Offline
                    O Offline
                    Oliver Broad
                    wrote on last edited by
                    #19

                    This seems to be the top search result for this warning so I'd like to add a note relating to a case I've found.

                    I've cloned and built the open-source project "qModMaster", and this warning comes up a lot.

                    What appears to have happened is that the library "libmodbus" is statically linked into qModMaster, but the libmodbus source assumes it will be implemented as a DLL, so the warnings come up every time it attempts to import/export a function. I believe the inconsistency is that it has both a definition for the function and a directive to import the function.

                    . #if defined(_MSC_VER)
                    . # if defined(DLLBUILD)
                    . /* define DLLBUILD when building the DLL */
                    . # define MODBUS_API __declspec(dllexport)
                    . # else
                    . # define MODBUS_API __declspec(dllimport)
                    . # endif

                    In this case the library has been modified after adding it to the project, it isn't a clone so in the short term it is easiest to just define MODBUS_API as nothing.

                    SGaistS 1 Reply Last reply
                    0
                    • O Oliver Broad

                      This seems to be the top search result for this warning so I'd like to add a note relating to a case I've found.

                      I've cloned and built the open-source project "qModMaster", and this warning comes up a lot.

                      What appears to have happened is that the library "libmodbus" is statically linked into qModMaster, but the libmodbus source assumes it will be implemented as a DLL, so the warnings come up every time it attempts to import/export a function. I believe the inconsistency is that it has both a definition for the function and a directive to import the function.

                      . #if defined(_MSC_VER)
                      . # if defined(DLLBUILD)
                      . /* define DLLBUILD when building the DLL */
                      . # define MODBUS_API __declspec(dllexport)
                      . # else
                      . # define MODBUS_API __declspec(dllimport)
                      . # endif

                      In this case the library has been modified after adding it to the project, it isn't a clone so in the short term it is easiest to just define MODBUS_API as nothing.

                      SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #20

                      @Oliver-Broad said in Inconsistent dll linkage:

                      qModMaster

                      Hi and welcome to devnet,

                      Which version of qModMaster are you talking about ?

                      From a quick search, the only thing I have found is that libmodbus is a C library so it is not concerned by these export/import considerations and qModMaster does not use it as a library but compiles the sources it uses directly into the executable.

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0

                      • Login

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