cmake und libraries und ...
-
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
-
@MasterQ said in cmake und libraries und ...:
dependencyprovider.cpp
Template definitions hat man normallerweise in Headerdateien, versuch das mal
-
@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!
-