Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. cmake und libraries und ...
Forum Updated to NodeBB v4.3 + New Features

cmake und libraries und ...

Scheduled Pinned Locked Moved Solved German
3 Posts 2 Posters 597 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.
  • MasterQM Offline
    MasterQM Offline
    MasterQ
    wrote on last edited by
    #1

    Moin,

    meine Erfahrungen mit Qt und C++ sind grob 25 Jahre her und ich versuche jetzt, da wieder ein bissl reinzukommen. Aktuell stolpere ich permanent über meine eigenen Füße und bleibe an Kleinigkeiten hängen. Man ist halt au nimmer der Jüngste im Kopp.

    Mein QWidget-Projekt soll aus verschiedenen eigenen Libs gebastelt werden, die aktuell statisch gelinkt werden sollen.

    Beim Erstellen der Anwendung erhalte ich die Meldung(en)

    Fehler: undefined reference to void DependencyProvider::AddSingelton<QSettings>(QString)'
    

    bzw:

    Fehler: undefined reference to `QSettings* DependencyProvider::GetSingleton<QSettings>(QString)'
    

    bei

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        DependencyProvider::AddSingelton<QSettings>("Settings");
        settings = DependencyProvider::GetSingleton<QSettings>("Settings");
    
        setWindowTitle(settings->value("ApplicationName", "N/A").toString());
    }
    

    Auf den ersten Blick sieht das für mich so aus, als ob was nicht gelinkt wird.

    Diese Methoden stammen aus der Klasse DependencyProvider

    dependencyprovider.cpp

    template<class T>
    void DependencyProvider::AddSingelton(QString key)
    {
        if(!backingsingletons.contains(key)){
            backingsingletons.insert(key,new T());
        }
    }
    
    template<class T>
    T * DependencyProvider::GetSingleton(QString key)
    {
        if(!backingsingletons.contains(key)){
            return backingsingletons.value(key);
        }
        return nullptr;
    }
    
    BackingMap DependencyProvider::backingsingletons;
    
    void DependencyProvider::Dispose(){
        backingsingletons.clear();
    }
    

    mit dependencyprovider.h

    #ifndef DEPENDENCYPROVIDER_H
    #define DEPENDENCYPROVIDER_H
    
    #include <QString>
    #include <QMap>
    
    typedef void * objptr;
    typedef objptr (*func)(objptr arg);
    typedef QMap<QString, objptr> BackingMap;
    
    
    class DependencyProvider
    {
    public:
        //DependencyProvider();
        //objptr operator[](QString key);
        template<class T> static void AddSingelton(QString key);
        template<class T> static T * GetSingleton(QString key);
        static void Dispose();
    
    private:
        static BackingMap backingsingletons;
    };
    
    #endif // DEPENDENCYPROVIDER_H
    

    soweit alles OK?

    Ein Blick in CMakelist.txt der Anwendung:

    set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
    add_executable(JHXManager ${PROJECT_SOURCES})
    target_link_libraries(JHXManager Widgets Injections Qt${QT_VERSION_MAJOR}::Widgets)
    

    Es sollen also drei Bibliotheken mit eingebunden werden, Widgets, Injections und Qt::Widgets

    Die ersten beiden sind meine eigenen. Nun funktioniert das mit libWidget aber nicht mit libInjections, wo die oben genannte Klasse DependencyProvider definiert ist.

    Ich finde im Quellcode keinen Fehler
    Die beiden Libs libWidget und libInjections sind sehr ähnlich aufgebaut, die CMakeList-Dateien eigentlichidentisch.

    add_library(Widgets STATIC  
        documentsview.h documentsview.cpp
    )
    target_link_libraries(Widgets DataBase Qt${QT_VERSION_MAJOR}::Widgets)
    target_include_directories(Widgets INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
    
    add_library(Injections STATIC
    dependencyprovider.h dependencyprovider.cpp
    )
    target_link_libraries(Injections DataBase Qt${QT_VERSION_MAJOR}::Core)
    target_include_directories(Injections INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
    
    

    Also entweder wird libInjections nicht gefunden/gelinkt oder am Quelltext ist was faul.

    Any Hints? Ich steh auf dem Schlauch!

    Joachim

    jsulmJ 1 Reply Last reply
    0
    • MasterQM MasterQ

      Moin,

      meine Erfahrungen mit Qt und C++ sind grob 25 Jahre her und ich versuche jetzt, da wieder ein bissl reinzukommen. Aktuell stolpere ich permanent über meine eigenen Füße und bleibe an Kleinigkeiten hängen. Man ist halt au nimmer der Jüngste im Kopp.

      Mein QWidget-Projekt soll aus verschiedenen eigenen Libs gebastelt werden, die aktuell statisch gelinkt werden sollen.

      Beim Erstellen der Anwendung erhalte ich die Meldung(en)

      Fehler: undefined reference to void DependencyProvider::AddSingelton<QSettings>(QString)'
      

      bzw:

      Fehler: undefined reference to `QSettings* DependencyProvider::GetSingleton<QSettings>(QString)'
      

      bei

      MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent)
          , ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
      
          DependencyProvider::AddSingelton<QSettings>("Settings");
          settings = DependencyProvider::GetSingleton<QSettings>("Settings");
      
          setWindowTitle(settings->value("ApplicationName", "N/A").toString());
      }
      

      Auf den ersten Blick sieht das für mich so aus, als ob was nicht gelinkt wird.

      Diese Methoden stammen aus der Klasse DependencyProvider

      dependencyprovider.cpp

      template<class T>
      void DependencyProvider::AddSingelton(QString key)
      {
          if(!backingsingletons.contains(key)){
              backingsingletons.insert(key,new T());
          }
      }
      
      template<class T>
      T * DependencyProvider::GetSingleton(QString key)
      {
          if(!backingsingletons.contains(key)){
              return backingsingletons.value(key);
          }
          return nullptr;
      }
      
      BackingMap DependencyProvider::backingsingletons;
      
      void DependencyProvider::Dispose(){
          backingsingletons.clear();
      }
      

      mit dependencyprovider.h

      #ifndef DEPENDENCYPROVIDER_H
      #define DEPENDENCYPROVIDER_H
      
      #include <QString>
      #include <QMap>
      
      typedef void * objptr;
      typedef objptr (*func)(objptr arg);
      typedef QMap<QString, objptr> BackingMap;
      
      
      class DependencyProvider
      {
      public:
          //DependencyProvider();
          //objptr operator[](QString key);
          template<class T> static void AddSingelton(QString key);
          template<class T> static T * GetSingleton(QString key);
          static void Dispose();
      
      private:
          static BackingMap backingsingletons;
      };
      
      #endif // DEPENDENCYPROVIDER_H
      

      soweit alles OK?

      Ein Blick in CMakelist.txt der Anwendung:

      set(PROJECT_SOURCES main.cpp mainwindow.cpp mainwindow.h mainwindow.ui)
      add_executable(JHXManager ${PROJECT_SOURCES})
      target_link_libraries(JHXManager Widgets Injections Qt${QT_VERSION_MAJOR}::Widgets)
      

      Es sollen also drei Bibliotheken mit eingebunden werden, Widgets, Injections und Qt::Widgets

      Die ersten beiden sind meine eigenen. Nun funktioniert das mit libWidget aber nicht mit libInjections, wo die oben genannte Klasse DependencyProvider definiert ist.

      Ich finde im Quellcode keinen Fehler
      Die beiden Libs libWidget und libInjections sind sehr ähnlich aufgebaut, die CMakeList-Dateien eigentlichidentisch.

      add_library(Widgets STATIC  
          documentsview.h documentsview.cpp
      )
      target_link_libraries(Widgets DataBase Qt${QT_VERSION_MAJOR}::Widgets)
      target_include_directories(Widgets INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
      
      add_library(Injections STATIC
      dependencyprovider.h dependencyprovider.cpp
      )
      target_link_libraries(Injections DataBase Qt${QT_VERSION_MAJOR}::Core)
      target_include_directories(Injections INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
      
      

      Also entweder wird libInjections nicht gefunden/gelinkt oder am Quelltext ist was faul.

      Any Hints? Ich steh auf dem Schlauch!

      Joachim

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

      @MasterQ said in cmake und libraries und ...:

      dependencyprovider.cpp

      Template definitions hat man normallerweise in Headerdateien, versuch das mal

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

      MasterQM 1 Reply Last reply
      1
      • jsulmJ jsulm

        @MasterQ said in cmake und libraries und ...:

        dependencyprovider.cpp

        Template definitions hat man normallerweise in Headerdateien, versuch das mal

        MasterQM Offline
        MasterQM Offline
        MasterQ
        wrote on last edited by
        #3

        @jsulm said in cmake und libraries und ...:

        @MasterQ said in cmake und libraries und ...:

        dependencyprovider.cpp

        Template definitions hat man normallerweise in Headerdateien, versuch das mal

        uih, ja das war es!

        1 Reply Last reply
        0
        • MasterQM MasterQ has marked this topic as solved on

        • Login

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