DLL externer 3. benutzen

Verschiedenes zu Qt
Antworten
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

DLL externer 3. benutzen

Beitrag von kowi1134 »

Hallo!

Ich habe ein winziges C++ Programm (main.cpp), das auf Funktionen in einer DLL zurückgreift.
Wenn ich den Quelltext übersetzen und binden lassen will mache ich das bisher so:

Code: Alles auswählen

c:\g++ -c main.cpp
c:\g++ main.o -L.MEINE.DLL -o main.exe
In einem Schritt sieht das dann so aus

Code: Alles auswählen

c:\g++ -L.MEINE.DLL main.cpp -o main.exe
Für den, der sich für die C++ Datei interessiert (ist wie gesagt nich viel):

Code: Alles auswählen

#include <iostream>

extern "C" int resetSystem( void );

int main()
{
  resetSytem();
  return 0;
}
Wie dem auch sei, mein Problem ist jetzt, dass ich die Funktionen der DLL auch in einem Qt Projekt brauche. Da ich aber nur die Evaluation Version besitze, kann ich den g++ schon mal nicht benutzen, sondern bin auf den Compiler von Visual Studio C++ 6.0 angewiesen.

Meine Kenntnisse reichen soweit, dass ich glaube, eine *.pro Datei zu verstehen. Ich würde also gerne eine mit qmake -project erzeugte *.pro Datei so verändern, dass MEINE.DLL als Bibliothek miteingebunden wird.

Wie geht das?

In der Dokumentation zu qmake finde ich leider nur hilfe, wenn das zu erzeugende Programm selbst eine DLL sein soll.

Muss ich vielleicht die automatisch generierte Makefile manuell abändern?

Grüße
Konrad
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Hallo,

wenn ich dich richtig verstehe möchtest du wissen, wie eine Lib gelinkt wird. qmake ist ein sehr mächtiges Werkzeug, und solche Dinge gehen mit den hinzufügen von dem Schlüsselwort LIBS zu der *.pro Datei.

Wenn deine Lib libname.so lautet und unter /verzeichnis liegt sollte es so aussehen:
LIBS += -L/verzeichnis -lname
Und so für statisch linken:
LIBS += /verzeichnis/name.a
Unter Win würde die Lib dann name.lib heißen und die Zeile würde so aussehen:
LIBS += c:\verzeichnis\name.lib
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

Die Sache ist die: Die DLL habe ich nicht selbst erstellt und alles was ich habe ist eben die DLL Datei selbst und eine von mir angefertigte Header-Datei in der eben die oben besagten Prototypen der Funktionen stehen, die in der DLL compiliert sind (siehe: extern "C" int resetSystem(); ).
Wie also benutze ich qmake mit einer .dll Datei?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Du hast also sicher nur die Runtime Bibliothek? Keine Export Datei, keine .lib Datei? Und den Header hast du selber gemacht? Ist es ein Modul? Wenn es ein Modul ist, musst du es nicht in die .pro Datei einbinden einfach nur mit z.B. QLibrary laden und dementsprechend benutzen. Wenn es allerdings wirklich eine Bibliothek ist, weiß ich nicht, wie man ohne Export oder ohne vorhandene .lib Datei darauf zugreifen kann, wenn es überhaupt so ohne weiteres möglich ist.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

Also ich habe die Header Datei selbst erstellt aber nichts mit der DLL am Hut gehabt. Es wurden Ihr ein paar Programmbeispiele in Pascal mitgeliefert, aber Gott bewahre: Daraus habe ich mir nur meine Funktionsargumente zusammengebastelt. Die Funktionsnamen habe ich der DLL Datei selbst entnommen und zwar mit dem Befehl:

Code: Alles auswählen

DUMPBIN meine.dll /EXPORTS
das liefert dann die folgende Exporttabelle:

Code: Alles auswählen

Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file ICRDLL32.dll

File Type: DLL

  Section contains the following exports for icrdll32.dll

           0 characteristics
           0 time date stamp Thu Jan 01 01:00:00 1970
        0.00 version
           1 ordinal base
          14 number of functions
          14 number of names

    ordinal hint RVA      name

         14    0 0003C16C GetINPUT
          8    1 0003BF24 Login
          4    2 0003BDE8 PowerDown
          5    3 0003BE30 PowerOn
         10    4 0003BFF4 ReadPage
          7    5 0003BEBC ReadUnique
          6    6 0003BE78 ResetTag
         12    7 0003C0D4 SetOutput
         13    8 0003C120 SetRNr
          2    9 0003BD7C SetReaderNr
         11    A 0003C06C WritePage
          9    B 0003BF80 WritePassword
          1    C 0003BD54 comInit
          3    D 0003BD9C resetSystem

  Summary

        1000 .edata
        2000 .idata
        4000 .reloc
        4000 .rsrc
        1000 BSS
       3C000 CODE
        1000 DATA
Und wie gesagt, es läuft alles ganz schnieke mit g++!

Dein Tipp war:
Wenn deine Lib libname.so lautet und unter /verzeichnis liegt sollte es so aussehen:
LIBS += -L/verzeichnis -lname
Und so für statisch linken:
LIBS += /verzeichnis/name.a
Unter Win würde die Lib dann name.lib heißen und die Zeile würde so aussehen:
LIBS += c:\verzeichnis\name.lib
Offenbar bin ich auf dem richtigen Weg, denn "LIBS += -L/verzeichnis -lname" dieht schonmal so ähnlich aus wie mein "c:\g++ -L.MEINE.DLL main.cpp -o main.exe" zum kompilieren eines gewöhnlichen C++ Programms, das die DLL benutzt.

Wofür steht das "-lname" in "LIBS += -L/verzeichnis -lname"?
Muss ich den kompletten Pfad angeben, wenn die DLL im selben Verzeichnis wie die main.cpp steht oder reicht es zu schreiben "LIBS += -L.ICRDLL32.dll"?

Ciao
Konrad
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Wenn eine Lib libmeinelib.so heißt steht das -lmeinelib für das linken gegene libmeinelib.so. -L steht für ein Verzeichnis, welches nach der Lib durchsucht werden soll.
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Nochmal zu meiner DLL-Geschichte...

Beitrag von kowi1134 »

Ich habe mittlerweile ein Programm gefunden, dass mir aus einer .dll eine .lib macht. Es heißt dll2lib. Ich finde jedoch keines, dass aus einer .dll oder .lib eine .so machen kann. Wer kann zaubern und bekommt das hin?
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Das sind doch 2 verschiedene Formate!?!?!
Das wird nicht gehen, nur die wineAPI kann dll und lib's emulieren. Aber halt mehr oder weniger gut. Kannst du uns einmal aufklären, wozu genau das gut ist, was du da machen willst?

Welche Lib brauchst du unbedingt, die es nicht eh frei gibt, oder die es für Linux nicht gibt? Also wenn das von dll, lib in so gehen würde, dann hätte Linux wohl kaum ein Problem mit Anwendungen!?!?
kowi1134
Beiträge: 120
Registriert: 1. Mai 2005 17:48
Wohnort: Arnsberg

Beitrag von kowi1134 »

Da hast Du vermutlich recht!
Zur Sache: Ich schreibe ein Programm, mit dem man RFIDs auslesen kann. Das Ganze wird an ein eWarenhaus angebunden und oben drüber liegt die GUI.
Antworten