externe Bibliothek(.dll/.lib) einbinden

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Kasparow
Beiträge: 5
Registriert: 29. Juli 2011 22:21

externe Bibliothek(.dll/.lib) einbinden

Beitrag von Kasparow »

Hallo,

vorweg: ich arbeite erst seit kurzem mit Qt und auch mit c++ generell noch nicht so lange.
Ich habe folgendes Problem:

Ich möchte mit Hilfe eines Qt-GUI's ein Gerät ansteuern und benötige hierfür Funktionen, die der Hersteller bereitstellt.
Es sind ebenfalls zwei Qt-Demoprogramme dabei, leider für eine 64Bit Version. Ich arbeite mit 32Bit Windows XP SP3
und dem mingw- compiler. Habe trotzdem versucht die Bibliothek statisch zu linken, was nicht funktioniert hat, wer hätte es
gedacht, gab folgende Fehlermeldung:

Code: Alles auswählen

debug/mainwindow.o:L:\Robotik_Labor\Qt_GUIS\spect-build-desktop/../spect/mainwindow.cpp:39: undefined reference to `AVS_Init@4'
debug/mainwindow.o:L:\Robotik_Labor\Qt_GUIS\spect-build-desktop/../spect/mainwindow.cpp:50: undefined reference to `AVS_Done@0'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\spect.exe] Error 1
mingw32-make: *** [debug] Error 2
Der Prozess "C:\QtSDK\mingw\bin\mingw32-make.exe" wurde mit dem Rückgabewert 2 beendet.
Fehler beim Erstellen des Projekts spect(Ziel: Desktop)
Bei der Ausführung von Build-Schritt 'Make'
Auch das statische Einbinden der Bibliothek aus den anderen Demoprogrammen (Borland/Codegear usw.) für die 32Bit Version hat nicht
funktioniert, hier fehlt immer die vcl.h, keine Ahnung was das ist.

Wollte jetzt mal probieren ob es mit dynamischem Linken klappt, kann aber nirgends ein Beispiel finden was ich verstehe.
Hab noch nie mit dll's gearbeitet und keinen Plan wie man sie einbindet. Das Qt4-Buch hilft da auch nicht sonderlich weiter und
das Beispiel zur QLibrary Class Reference verstehe ich ehrlich gesagt nicht.
Wäre super wenn mir jemand ein kurzes, leicht verständliches Beispiel posten könnte. Bin mittlerweile echt verzweifelt....
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von franzf »

Qt Assistant -> qmake Variable Reference -> LIBS
Kasparow
Beiträge: 5
Registriert: 29. Juli 2011 22:21

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von Kasparow »

Erstmal danke für die schnelle Antwort,
allerdings beschreibt das ja auch wieder nur die statische Variante mit Header und .lib.
Hab ich genauso probiert und gab obige Fehlermeldung, deshalb würde ich gerne das
dynamische Einbinden mit der dll probieren. Wenn jemand weiss wie das geht und vielleicht
ein kurzes Beispiel für mich hätte, wär super. Muss irgendwie mit load() oder resolve() gehen,
verstehe allerdings nicht wie und auch nicht wo in meinem Programm ich das aufrufen muss.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von franzf »

Verwechlse dynamisches Linken bitte nicht mit dynamischem Laden von Bibliotheken zur Laufzeit!
Mir scheint es so, als wolltest du tatsächlich ganz normal dynamisch Linken. Du willst ja den Header einbinden und dann die Funktionen afurufen.
Per QLibrary ginge das wohl auch (dann ohne Header), ist aber ungemein komplizierter! Du musst dir manuell alle Symbole aus der Lib holen, und dann über einen Funktionszeiger aufrufen.

Am besten zeigst du uns dein Setup, deine Konfiguration und - wichtig - die genauen Fehlermeldungen.
Und wenn du jetzt echt versuchst, auf einem 32Bit-System die mitgelieferten 64Bit-DLLs zu laden - lass es, geht nicht. Umgekehrt (32Bit laden auf 64Bit) sollte gehen.
Kasparow
Beiträge: 5
Registriert: 29. Juli 2011 22:21

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von Kasparow »

Ok, also dann doch wieder mit .h und .lib.
Ich versuche mal zu beschreiben was ich gemacht habe:

vorweg: Die Dateien die ich benutze, habe ich aus den Programmbeispielen von der CD. In diesem Fall habe ich mal die as.h, as.lib und as.dll aus einem
Beispiel, was mit vcpp2008 geschrieben wurde, genommen.

1. Habe die as.lib, die as.dll und die as.h in meinen Projektordner kopiert.
2. Habe die as.dll zusätzlich auch in den Release-Ordner kopiert.
3. Habe in meinem pro-file geschrieben: LIBS += as.lib und habs auch mal mit LIBS += C:/"Pfad"/as.lib probiert.
4. Habe die as.h in meinen Header includiert.
5. Rufe in mainwindow.cpp zwei Funktionen aus der Bibliothek auf.

Bekomme mittlerweile garkeinen Fehler mehr sondern nur die Aussage:

Code: Alles auswählen

Der Prozess "D:\Programme\QtSDK\mingw\bin\mingw32-make.exe" wurde normal beendet.
und den Rückgabewert:

Code: Alles auswählen

Rückgabewert -1073740966
Wird aber anschließend kein Fenster geöffnet.
Kann es sein das der mingw Compiler den ich benutze mit dem Header nichts anfangen kann.

Meine Build-Konfiguration:
Qt 4.7.3 for Desktop - MinGW 4.4(Qt SDK)Release
Toolchain: Mingw as a GCC for Windows targets
qmake: qmake.exe spect.pro -r -spec win32-g++ "CONFIG+=release"
Make: mingw32-make.exe in blablabla\spect

Hoffe jemand kann mir helfen, werde hier echt noch verrückt...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von franzf »

Wenn du eine exe hast, die noch dazu lauffähig zu seine scheint, dann hatte der Compiler wohl nichts zu meckern, auch der Linker war diesmal zufrieden.
Kammst du mal den Code aus deiner int main() und deinem MainWindow-Konstruktor posten?
Am allerbesten wäre ein minimales Beispiel. Da du proprietäre Libs verwendest, wird das hier nicht jeder kompilieren können (weil du das Teil wohl nicht weitergeben darfst).
Kasparow
Beiträge: 5
Registriert: 29. Juli 2011 22:21

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von Kasparow »

Also ich hab jetzt einfach mal ein neues Projekt gestartet, indem ich nichts anderes mache als die Bibliothek zu Linken
und zum Test eine Funktion daraus aufzurufen. Der Code ist wie folgt:

Pro-File:

Code: Alles auswählen

QT       += core gui

TARGET = EinbindenTest
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

win32: LIBS += -L$$PWD/ -las5216

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD/
Die as5216.h, die as5216.dll und die as5216.lib liegen im Projektordner, die .lib ist mit "Rechtsklick/Bibliothek einbinden" im pro-file gelinkt

Header:

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include "as5216.h"
#include <QMainWindow>
#include <QLineEdit>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QLineEdit* Ausgabe;

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
main.cpp:

Code: Alles auswählen

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
mainwindow.cpp:

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    Ausgabe = new QLineEdit(this);

    int a = AVS_Init(0);
    Ausgabe -> setText(QString::number(a));
}

MainWindow::~MainWindow()
{
    delete ui;
}
Wie du schon selber sagst, kann ich die Bibliotheken natürlich nicht mit anhängen, es sei denn ich möchte mich strafbar machen.
Wenn ich kompiliere kommt jetzt ein Fenster was mir sagt:

Code: Alles auswählen

EinbindenTest: EinbindenTest.exe - Fehler in Anwendung

Die Anweisung in "0x800000001" verweist auf Speicher in "0x800000001".
Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.
Ich danke dir schon mal im Vorraus für deine Hilfe, wenn ich diesen Sch****, der doch eigendlich total einfach sein müßte, nicht bald hinbekomme,
könnte es sein das ich einen neuen Monitor brauche oder ne neue Tastatur :twisted:
Kasparow
Beiträge: 5
Registriert: 29. Juli 2011 22:21

Re: externe Bibliothek(.dll/.lib) einbinden

Beitrag von Kasparow »

So, hab das Problem gefunden aber noch nicht endgültig gelöst, weiß jetzt zumindest woran es liegt.
Die dll die ich einbinden will ist wohl mit visual studio kompiliert oder erstellt worden und das
mag der mingw-Compiler nicht.
Werd mir jetzt den vs-compiler besorgen oder mal mit dem Hersteller reden..
@franzf: Danke nochmal für deine Hilfe!
Antworten