Probleme mit eigener Bibliothek

Du bist neu in der Welt von C++? Dann schau hier herein!
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Probleme mit eigener Bibliothek

Beitrag 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.
Zuletzt geändert von dolin93 am 30. Mai 2012 21:31, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit eigener Bibliothek

Beitrag 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.
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit eigener Bibliothek

Beitrag von dolin93 »

Vielen Dank für Deine Antwort!
Nach dem Einfügen eines zusätzlichen #endif verschwindet eine Fehlermeldung, aber leider bleiben alle anderen.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit eigener Bibliothek

Beitrag 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?
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit eigener Bibliothek

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit eigener Bibliothek

Beitrag 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
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit eigener Bibliothek

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit eigener Bibliothek

Beitrag 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.
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit eigener Bibliothek

Beitrag von dolin93 »

Vielen Dank!
Den Ordner habe ich gesendet.
Zuletzt geändert von dolin93 am 30. Mai 2012 21:42, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit eigener Bibliothek

Beitrag 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)
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit eigener Bibliothek

Beitrag von dolin93 »

Qt_forum.zip
(2.52 KiB) 406-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.
Zuletzt geändert von dolin93 am 30. Mai 2012 21:39, insgesamt 3-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Probleme mit eigener Bibliothek

Beitrag 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
dolin93
Beiträge: 45
Registriert: 5. Mai 2012 21:35

Re: Probleme mit eigener Bibliothek

Beitrag 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.
    Zuletzt geändert von dolin93 am 30. Mai 2012 21:36, insgesamt 1-mal geändert.
    franzf
    Beiträge: 3114
    Registriert: 31. Mai 2006 11:15

    Re: Probleme mit eigener Bibliothek

    Beitrag 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.
    dolin93
    Beiträge: 45
    Registriert: 5. Mai 2012 21:35

    Re: Probleme mit eigener Bibliothek

    Beitrag 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.
    Zuletzt geändert von dolin93 am 30. Mai 2012 21:37, insgesamt 1-mal geändert.
    Antworten