Seite 1 von 2

Probleme mit eigener Bibliothek

Verfasst: 14. Mai 2012 14:45
von dolin93
Da mittlerweilen das Programm zur Vektoraddition mit QVector gut funktioniert,
habe ich mir gedacht, ich könnte vielleicht eine eigene Bibliothek für Vektorberechnungen und später für Matrixoperationen anlegen, aber es gab da gleich eine Menge Fehlermeldungen. Zuerst habe ich ein neues Qt4-Projekt mit dem Namen Vektor_Bibliothek angelegt, dort die die Klasse MatDemo

Code: Alles auswählen

#ifndef MATDEMO_H
#define MATDEMO_H
#ifndef BUILD_DLL
#define EXPORT_DLL
#include <QVector>

class EXPORT_DLL MatDemo:public QObject
{
QOBJECT
public:
    MatDemo(const QVector<double> &v1, const QVector<double> &v2);
{
}
~MatDemo(const QVector<double> &v1, const QVector<double> &v2);
{
}
    void addiereVec(QVector<double> &result);
private:
   QVector<double>_v1;
   QVector<double>_v2;
};

#endif // MATDEMO_H
#include "matdemo.h"
#include <QObject>
#include <iostream>

MatDemo::MatDemo(const QVector<double> &v1, const QVector<double> &v2) : _v1(v1), _v2(v2)
{
}
void MatDemo::addiereVec(QVector<double> &result)
{int M=qMin(_v1.size(),_v2.size())
    for(int i=0;i<5;i++)
    {
        result.push_back(_v1[i]+_v2[i]);
        std::cout<<"  result[i]="<<result[i]<<"   _v1[i]="<<_v1[i]<<std::endl;
    }
}
eingefügt und die Datei Vektor_Bibliothek.pro umgeändert in
TEMPLATE=lib
DEPENDPATH+=.
INCLUDEPATH+=.
CONFIG+=dll qt thread
DEFINES+=BUILD_DLL
HEADERS += matdemo.h
SOURCES += matdemo.cpp
und dann alles kompiliert. Dann gab es folgende Fehlermeldungen.
/Qt_Beispiele/Vektor_Bibliothek/matdemo.h:1: error: unterminated #ifndef
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:5: error: ‘MatDemo’ has not been declared
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:5: error: ISO C++ forbids declaration of ‘MatDemo’ with no type
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:5: error: only constructors take base initializers
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:8: error: ‘MatDemo’ is not a class or namespace
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:9: error: ‘_v1’ was not declared in this scope
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:9: error: ‘_v2’ was not declared in this scope
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:10: error: expected ‘,’ or ‘;’ before ‘for’
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:10: error: ‘i’ was not declared in this scope
/Qt_Beispiele/Vektor_Bibliothek/matdemo.cpp:10: error: expected ‘;’ before ‘)’ token
Hernach habe ich noch ein leeres Qt4-Projekt mit dem Namen Test_Bibliothek_Main angelegt dort die folgende Quelldatei

Code: Alles auswählen

#include "home/....s/Qt_Beispiele/dynamicLib/Vektor_Bibliothek/matdemo.h"
#include <QApplication>
#include <QtCore/QCoreApplication>
#include <iostream>
#include <QVector>

    int main(int argc, char *argv[])
{   typedef QVector<double> vec;
    QCoreApplication a(argc, argv);
    double x[5]={1.1,2.2,3.3,4.4,5.5};
    double y[5]={2.2,4.4,6.6,8.8,11.0};
    QVector<double>v1;
    ;
    for(int i=0;i<5;i++)
    {v1.push_back(x[i]);
    }
    vec v3;
    v3.push_back(9.99);
    QVector<double> v2;
    for(int i=0;i<5;i++)
    {v2.push_back(y[i]);
     v3.push_back(y[i]);
        std::cout<<"  i="<<i<<"   v1="<<v1[i]<<"  x[i]="<<x[i]<<"   v3="<<v3[i]<<std::endl;

    }
    MatDemo demo(v1,v2);
    QVector<double> result;
    demo.addiereVec(result);
    for(int i=0;i<result.size();i++)
    {
        std::cout<<"  result[i]="<<result[i]<<std::endl;
   }


    return a.exec();
}
untergebracht und die Datei Test_Bibliothek_Main.pro umgeändert in
TEMPLATE=app
TARGET=MatDemo
DEPENDPATH+=.
INCLUDEPATH+=.
LIBS+=/home/...s/Qt_Beispiele/libdynamicLib.a
SOURCES += main.cpp
Dies ergab folgende Fehlermeldungen.
/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:1: error: home/....s/Qt_Beispiele/dynamicLib/Vektor_Bibliothek/matdemo.h: Datei oder Verzeichnis nicht gefunden
/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:26: error: ‘MatDemo’ was not declared in this scope
/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:26: error: expected ‘;’ before ‘demo’
/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:28: error: ‘demo’ was not declared in this scope
Kann mir jemand mitteilen, was ich ändern muß? In meinem Buch zu Qt steht hierüber fast gar nichts.

Re: Probleme mit eigener Bibliothek

Verfasst: 15. Mai 2012 08:23
von franzf
dolin93 hat geschrieben:und dann alles kompiliert. Dann gab es folgende Fehlermeldungen.

Code: Alles auswählen

/Qt_Beispiele/Vektor_Bibliothek/matdemo.h:1: error: unterminated #ifndef
Ein #ifndef braucht immer ein zugehöriges #endif an der passenden (!) Stelle. Du hast zwei #ifndef aber nur ein #endif.

Re: Probleme mit eigener Bibliothek

Verfasst: 16. Mai 2012 10:20
von dolin93
Vielen Dank für Deine Antwort!
Nach dem Einfügen eines zusätzlichen #endif verschwindet eine Fehlermeldung, aber leider bleiben alle anderen.

Re: Probleme mit eigener Bibliothek

Verfasst: 16. Mai 2012 10:25
von franzf
dolin93 hat geschrieben:Nach dem Einfügen eines zusätzlichen #endif verschwindet eine Fehlermeldung, aber leider bleiben alle anderen.
Bitte genauer!
WO hast du das #endif eingefügt? Und um welche Fehler geht es dir jetzt? Die in der dll, oder nur im benutzenden Projekt?

Re: Probleme mit eigener Bibliothek

Verfasst: 16. Mai 2012 15:21
von dolin93
Das #endif habe ich am Ende von matdemo.h angebracht, so daß jetzt 2 #endif untereinander stehen.
Das hat dazu geführt, daß die Fehlermeldung
Qt_Beispiele/Vektor_Bibliothek/matdemo.h:1: error: unterminated #ifndef
verschwunden ist, aber alle anderen in der dll und alle 4 im benützenden Programm sind erhalten geblieben. Früher, als ich noch Visual C++ benützte, hatte ich ein Kompendium, in dem genau stand, wie man beim Anlegen einer Bibliothek vorgehen muß und wie man sie von einem anderen Programm aus benützen kann. Leider scheint es etwas ähnliches zu Qt nicht zu geben. Ich würde halt gerne wissen, was ich ändern muß, so daß das Programm Test_Bibliothek_Main mit der Einbindung der Bibliothek läuft.
MfG

Re: Probleme mit eigener Bibliothek

Verfasst: 16. Mai 2012 15:34
von franzf
Das #endif habe ich am Ende von matdemo.h angebracht, so daß jetzt 2 #endif untereinander stehen.
Dann überleg kurz, was das jetzt genau bedeutet:

Code: Alles auswählen

#ifndef MATDEMO_H
#define MATDEMO_H

#ifndef BUILD_DLL

// Falls BUILD_DLL NICHT definiert ist, mach weiter
// BUILD_DLL wird aber per DEFINES im .pro gesetzt.
// Dadurch wird der gesamte Block bis zum schließenden #endif übersprungen
// Somit fehlen alle Deklarationen/Definitionen/... aus diesem Bereich
// Weshalb natürlich auch die Klasse "MatDemo" fehlt.

#define EXPORT_DLL

// Genau HIERHER wolltest du eigentlich das #endif setzen

#include <QVector>

class EXPORT_DLL MatDemo:public QObject
{
QOBJECT
public:
    MatDemo(const QVector<double> &v1, const QVector<double> &v2);
{
}
~MatDemo(const QVector<double> &v1, const QVector<double> &v2);
{
}
    void addiereVec(QVector<double> &result);
private:
   QVector<double>_v1;
   QVector<double>_v2;
};

#endif // BUILD_DLL
#endif // MATDEMO_H

Re: Probleme mit eigener Bibliothek

Verfasst: 16. Mai 2012 21:09
von dolin93
Vielen Dank!
Diesen Fehler habe ich nun korrigiert. Jetzt gibt es beim Erstellen der Vektor_Bibliothek nur noch eine Fehlermeldung und zwar
  • Qt_Beispiele/Vektor_Bibliothek/matdemo.h:8: error: expected initializer before ‘:’ token.
Beim Erstellen von Test_Bibliothek_Main sind natürlich die Fehler noch geblieben. Wenn Du mir noch helfen könntest bis dieses Programm läuft, dann wäre ich extrem erfreut und hätte in Zukunft ein Beispiel, an dem ich mich orientieren könnte.

Re: Probleme mit eigener Bibliothek

Verfasst: 18. Mai 2012 09:55
von franzf
Pack mal bitte beide Projekte samt .pro aber OHNE binaries (libs, executables und vor allem kein Qt! - also nur deine eigenen sources) in ein .zip und hänge es hier über die Foren-Funktion "Dateianahang hochladen" an. Damit wir sehen können, was du genau wo und wie machst.

Re: Probleme mit eigener Bibliothek

Verfasst: 18. Mai 2012 23:17
von dolin93
Vielen Dank!
Den Ordner habe ich gesendet.

Re: Probleme mit eigener Bibliothek

Verfasst: 19. Mai 2012 10:11
von franzf
1. Fehler: #ifndef BUILD_DLL, aber BUILD_DLL im .pro definieren -> fehlender Zweig -> EXPORT_DLL wurde nicht definiert aber verwendet
Überleg dir erst mal, was das mit dem EXPORT_DLL auf sich hat, ob du es willst, ob du es brauchst. Nach dieser Recherche weißt du auch, was du setzen musst.

Danach solltest du die restlichen Fehler mit den Meldungen des Compilers selber lösen können (HINT: fehlender include, unnötige geschweifte Klammern)

Re: Probleme mit eigener Bibliothek

Verfasst: 19. Mai 2012 17:26
von dolin93
Qt_forum.zip
(2.52 KiB) 519-mal heruntergeladen
Deinen Empfehlungen gemäß habe ich versucht, Korrekturen anzubringen. Wenn ich nun Vektor_Bibliothek erstelle, so gibt es keine Fehlermeldungen mehr. Aber wenn ich Test_Bibliothek_Main erstellen will,so klappt das noch nicht. Wenn ich

Code: Alles auswählen

#include "/home/...s/Qt_Beispiele/Vektor_Bibliothek/matdemo.h"
verwende, so erhalte ich zwar unter Build-Probleme keine Fehlermeldungen, aber unter Kompilierung erscheint:
Konfiguration unverändert, überspringe QMake-Schritt.
Starte: /usr/bin/make -w
make: Gehe in Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
g++ -o MatDemo main.o -L/usr/lib /home/...s/Qt_Beispiele/libdynamicLib.a -lQtGui -lQtCore -lpthread
g++: /home/...s/Qt_Beispiele/libdynamicLib.a: Datei oder Verzeichnis nicht gefunden
make: Verlasse Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
make: *** [MatDemo] Fehler 1
Beendet mit Rückgabewert 2.
Fehler beim Erstellen des Projekts Test_Bibliothek_Main
Beim Ausführen des Build-Schritts 'Make'.
Wenn ich

Code: Alles auswählen

 #include "/home/...s/Qt_Beispiele/Vektor_Bibliothek/dynamicLib/matdemo.h"
verwende, erhalte ich wie früher
/home/...s/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:2: error: /home/hans/Qt_Beispiele/Vektor_Bibliothek/dynamicLib/matdemo.h: Datei oder Verzeichnis nicht gefunden
/home/...s/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:27: error: ‘MatDemo’ was not declared in this scope
/home/...s/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:27: error: expected ‘;’ before ‘demo’
/home/...s/Qt_Beispiele/Test_Bibliothek_Main/main.cpp:29: error: ‘demo’ was not declared in this scope.

Re: Probleme mit eigener Bibliothek

Verfasst: 19. Mai 2012 21:05
von franzf
* das ist ein linker-fehler, da sind includes total wurscht (kompiliert wurde ja schon, wenn bereits gelinkt wird)
* http://qt-project.org/doc/qt-4.8/qmake- ... .html#libs

Re: Probleme mit eigener Bibliothek

Verfasst: 21. Mai 2012 21:30
von dolin93
Vielen Dank für Deine Antwort!
Den Eintrag im .pro hinter LIBS habe ich geändert und weil das Programm noch nicht läuft, habe ich insbesondere hinter -l mehrere Ausdrücke probiert.Momentan lautet die ganze Zeile

Code: Alles auswählen

LIBS+="-L/home/...s/Qt_Beispiele/Vektor_Bibliothek/matdemo.h" -lVektor_Bibliothek
Als Fehlermeldung erhalte ich
  • :-1: error: collect2: ld returned 1 exit status
    und unter Kompilierung steht
    • Führe Build-Schritte für Projekt Test_Bibliothek_Main aus...
      Konfiguration unverändert, überspringe QMake-Schritt.
      Starte: /usr/bin/make -w
      make: Gehe in Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
      /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ -unix CONFIG+=debug -o Makefile Test_Bibliothek_Main.pro
      make: Verlasse Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
      make: Gehe in Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
      g++ -o MatDemo main.o -L/usr/lib -L/home/...s/Qt_Beispiele/Vektor_Bibliothek/matdemo.h -lVektor_Bibliothek -lQtGui -lQtCore -lpthread
      /usr/bin/ld: cannot find -lVektor_Bibliothek
      collect2: ld returned 1 exit status
      make: Verlasse Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
      make: *** [MatDemo] Fehler 1
      Beendet mit Rückgabewert 2.
      Fehler beim Erstellen des Projekts Test_Bibliothek_Main
      Beim Ausführen des Build-Schritts 'Make'
      • Ich habe dann noch versucht herauszufinden, was in /usr/bin/ld steht, aber leider konnte ich diese Datei nicht öffnen.
        Allmählich wird mir das Fragen ein wenig peinlich. Aber andererseits denke ich mir: Wenn dieses Programm zusammen mit der Bibliothek läuft, dann dürfte es in Zukunft mit der Erstellung und Einbindung von anderen Bibliotheken keine besonderen Probleme mehr geben.

    Re: Probleme mit eigener Bibliothek

    Verfasst: 21. Mai 2012 21:41
    von franzf
    "-L/home/hans/Qt_Beispiele/Vektor_Bibliothek/matdemo.h"
    kann ja auch nicht funktionieren ;)
    -L gibt ein VERZEICHNIS an, in dem LIBS liegen, du gibst aber eine Headerdatei an.
    -L/home/hans/Qt_Beispiele/Vektor_Bibliothek/ sollte ber klappen.

    Re: Probleme mit eigener Bibliothek

    Verfasst: 22. Mai 2012 16:12
    von dolin93
    Vielen Dank für diesen Hinweis!
    Durch diese Veränderung klappt nun das Erstellen und man kann zu "Ausführen" gehen. Aber nach dem Ausführen erscheint unter Ausgabe der Anwendung:
    [list
    Starte /home/...s/Qt_Beispiele/Test_Bibliothek_Main/MatDemo...
    /home/hans/Qt_Beispiele/Test_Bibliothek_Main/MatDemo: error while loading shared libraries: libVektor_Bibliothek.so.1: cannot open shared object file: No such file or directory
    /home/...s/Qt_Beispiele/Test_Bibliothek_Main/MatDemo beendet, Rückgabewert 127[/list]
    und unter Kompilierung:
    • Führe Build-Schritte für Projekt Test_Bibliothek_Main aus...
      Konfiguration unverändert, überspringe QMake-Schritt.
      Starte: /usr/bin/make -w
      make: Gehe in Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
      make: Für das Ziel »first« ist nichts zu tun.
      make: Verlasse Verzeichnis '/home/...s/Qt_Beispiele/Test_Bibliothek_Main'
      Beendet mit Rückgabewert 0.