mikrocontroller.net

Forum: PC-Programmierung Qt: Native C /C++ DLL nutzen Compiler wichtig?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hab eine DLL für eine PXI-Relaykarte und würde Sie gerne mit 
Qt benutzen. Die DLL hab ich schon erfolgreich in C# und Python benutzt, 
aber ich muss die DLL nun in ein Qt Programm einbinden.

Das Qt Framework bietet dafür die QLibrary an, aber ich verstehe einen 
Punkt nicht. Ich benutze als Qt Compiler MiniGW, wenn die DLL aber mit 
einem anderen Compiler erstellt wurde, kann ich Sie dann trotzdem nutzen 
oder bin ich angewiesen den gleichen Compiler zunutzen?

Autor: Thomas Z. (Firma: Unaffiliated) (usbman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst für deinen Compiler eine Import lib gegen die du linken 
kannst. Wie du diese erstellen kannst sollte aus der Doc des Compilers 
hervorgehen.
Stichworte wären zb impdef /implib zum erzeugen dieser lib.
Dann noch ein entsprechendes h File mit den Declarationen und fertig ist 
die Laube.

Thomas

: Bearbeitet durch User
Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Thomas Z. schrieb:
> Du brauchst für deinen Compiler eine Import lib gegen die du linken
> kannst.

Nicht unbedingt:

http://www.mingw.org/wiki/CreateImportLibraries

> Usually (read: for all DLLs created with MinGW and also a few others)
> MinGW links fine against a DLL. No special import library is necessary

Thomas Z. schrieb:
> Dann noch ein entsprechendes h File mit den Declarationen und fertig ist
> die Laube.

Man muss aufpassen welches ABI, welche C-Library und was für C++ 
Exceptions benutzt wurde. Die sind nicht unbedingt kompatibel.

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du brauchst für deinen Compiler eine Import lib gegen die du linken
>kannst. Wie du diese erstellen kannst sollte aus der Doc des Compilers
>hervorgehen.
>Stichworte wären zb impdef /implib zum erzeugen dieser lib.
>Dann noch ein entsprechendes h File mit den Declarationen und fertig ist
>die Laube.


Ich hab keine lib Datei, sondern nur eine DLL. Wie gesagt die DLL wurde 
schon mit C# und Python in Projekten genutzt. Ich würde Sie nun gerne 
mit QLibrary laden. Die dynamische DLL möchte ich nicht statisch linken, 
sondern zur Laufzeit laden.


Die Frage, welche ich hab ist nun, ob ich mit MinGW als Compiler 
weiterarbeiten kann oder ob ich zu einen anderen Compiler gezwungen 
werde, weil die DLL mit einem anderen Compiler erstellt wurde.

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torben schrieb:
> Die Frage, welche ich hab ist nun, ob ich mit MinGW als Compiler
> weiterarbeiten kann oder ob ich zu einen anderen Compiler gezwungen
> werde, weil die DLL mit einem anderen Compiler erstellt wurde.

Das kann man nicht sagen ohne zu wissen womit die DLL erstellt wurde, 
welche C-Library sie nutzt und ob/welche Exceptions sie nutzt. Wenn sie 
aus Python ging ist das schon mal ein gutes Zeichen.

Autor: Der E. (rogie)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Du kannst die DLL auch dynamisch mit LoadLibrary einbinden:


https://stackoverflow.com/questions/8696653/dynamically-load-a-function-from-a-dll

Autor: Thomas Z. (Firma: Unaffiliated) (usbman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die DLL eh manuell öffnest spielt der Compiler keine Rolle mehr. 
Das DLL Format ist ja vorgegeben. Du benutzt ja dann die QT Funktionen 
die dir dann die Funktionen bereitstellen. Das wird intern wohl sowas 
wie loadlibrary() sein.
Die Funktionen werden dann per Index oder Name angesprochen.

Thomas

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gleiche Frage stellt sich auch für mich bei National Instrument 
NI-DAQMX, welche ich auch gerne nutzen möchte.

Wenn ich mit die Unterhaltung hier anschaue, dann ist es mit minGw wohl 
nicht so einfach möglich, weil die API in MS Visual C++ erstellt wurde.

https://forums.ni.com/t5/Multifunction-DAQ/Howto-use-NIDAQmx-with-mingw-gcc-3-4-2/td-p/294361?profile.language=en

Also werde indirekt zum MS Compiler gezwungen, wenn ich meine PXI DLL 
und NI-DAQMx benutzen will?

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Z. schrieb:
> Wenn du die DLL eh manuell öffnest spielt der Compiler keine Rolle mehr.

Das hat nichts miteinander zu tun. Auch eine dynamisch geöffnete DLL 
kann inkompatibel sein.

Autor: Der E. (rogie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niklas G. schrieb:
> Das hat nichts miteinander zu tun. Auch eine dynamisch geöffnete DLL
> kann inkompatibel sein.

Wenn es keine reine C- Schnittstelle ist, ja. Da sich diese aber in C# 
und Python einbinden lies, gehe ich davon aus, das es eine reine C- 
Schnittstelle ist.

: Bearbeitet durch User
Autor: Sven B. (scummos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die C-ABI ist idR immer gleich. Wenn das also eine C-Library ist ohne 
Name Mangling, sollte fast alles gehen.

Im Fall von C++ musst du idR zumindest unter Windows genau denselben 
Compiler verwenden.

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der E. schrieb:
> Du kannst die DLL auch dynamisch mit LoadLibrary einbinden:
>
> 
https://stackoverflow.com/questions/8696653/dynamically-load-a-function-from-a-dll

Thomas Z. schrieb:
> Wenn du die DLL eh manuell öffnest spielt der Compiler keine Rolle
> mehr.
> Das DLL Format ist ja vorgegeben. Du benutzt ja dann die QT Funktionen
> die dir dann die Funktionen bereitstellen. Das wird intern wohl sowas
> wie loadlibrary() sein.
> Die Funktionen werden dann per Index oder Name angesprochen.
>
> Thomas

Danke, ok das war mein Verständnis am Anfang auch, aber durch die 
unterschiedlichen Antworten im Internet war ich mir unsicher.

Also wenn ich die Lib. lade mit QLibrary wie z.b. mit Python ctypes, 
dann ist der Compiler welcher genutzt wurde egal. Wichtig ist nur die 
gleiche Architektur zunehmen x86 oder x64?

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn das also eine C-Library ist ohne Name Mangling, sollte fast alles >gehen.

Wie kann ich den herausfinden, ob es eine reine C DLL ist? Wie ich 
herausfinden kann, ob es eine Managed / Unmanaged DLL ist, hatte ich im 
Internet gefunden.

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven B. schrieb:
> Die C-ABI ist idR immer gleich. Wenn das also eine C-Library ist ohne
> Name Mangling, sollte fast alles gehen.

Auch in C kann man Heap-Allokationen durchführen, welche bei 
unterschiedlichen C-Libraries zu Konflikten führen können.

http://www.mingw.org/wiki/Interoperability_of_Libraries_Created_by_Different_Compiler_Brands

> A new/delete or malloc/free in a MSVC DLL will not co-operate with a Cygwin 
newlib new/delete or malloc/free. One cannot free space which was allocated in a 
function using a different new/malloc at all.

Torben schrieb:
> Wie kann ich den herausfinden, ob es eine reine C DLL ist?

Naja, besteht das API aus Klassen mit Funktionen, oder nur aus 
Funktionen? Kann das API Exceptions werfen?

: Bearbeitet durch User
Autor: Thomas Z. (Firma: Unaffiliated) (usbman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torben schrieb:
> 
https://forums.ni.com/t5/Multifunction-DAQ/Howto-use-NIDAQmx-with-mingw-gcc-3-4-2/td-p/294361?profile.language=en
>
> Also werde indirekt zum MS Compiler gezwungen, wenn ich meine PXI DLL
> und NI-DAQMx benutzen will?

Nein die beschreiben ja dort den Umweg mit der Importlib. Das ist bei MS 
übrigens ganz genauso. Nur das bei MS das ev in den Buildtools versteckt 
ist oder der Anbieter schon entsprechendes bereitstellt.

Thomas

: Bearbeitet durch User
Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: MSVC-C-Libraries sind ja teilweise nichtmal zwischen verschiedenen 
MSVC-Versionen kompatibel; alte libusb-DLLs lassen sich z.B. nicht mit 
aktuellem MSVC linken.

Torben schrieb:
> Also werde indirekt zum MS Compiler gezwungen

Das ist aber zum Glück nicht mehr so schlimm; als Community Edition 
gibt's MSVC kostenlos und der Compiler ist nicht mehr ganz so schlimm 
wie früher.

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Naja, besteht das API aus Klassen mit Funktionen, oder nur aus
>Funktionen? Kann das API Exceptions werfen?


Nein, somit eine C DLL. Alles klar, danke.

>Nein die beschreiben ja dort den Umweg mit der Importlib. Das ist bei MS
>übrigens ganz genauso. Nur das bei MS das ev in den Buildtools versteckt
>ist oder der Anbieter schon entsprechendes bereitstellt.


Ok, nun wird einiges klarer. Danke.

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das ist aber zum Glück nicht mehr so schlimm; als Community Edition
>gibt's MSVC kostenlos und der Compiler ist nicht mehr ganz so schlimm
>wie früher.


Richtig, aber bei kommerziellen Projekten wird man wohl VS kaufen 
müssen, aber der Preis für die VS Pro ist jetzt noch überschaubar.

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst du mit QT bezwecken in diesem Fall?
Wenn es nur um GUI geht, warum benutzt du nicht deinen existierenden 
Python Code zum kommunizieren mit der DLL und benutzt dort QT für den 
Rest?
Oder musst du unbedingt die DLL per QLibrary laden? Der Grund erschließt 
sich nicht wirklich.

Autor: Torben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, nein es geht nicht nur um GUI. Die neue Applikation soll alles 
vereinheitlichen und dafür bietet sich Qt an.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven B. schrieb:
> Im Fall von C++ musst du idR zumindest unter Windows genau denselben
> Compiler verwenden.

Genau der selbe brauchts nicht zu sein, einer mit zugesicherter 
Binärkompatibilität sollte es tun.

Wenn das C++-Interface entspechend gestaltet ist, klappt das auch mit 
anderen Compilern.

https://www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL#CppMatureApproach

Oliver

Autor: stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torben schrieb:
> Hallo, nein es geht nicht nur um GUI. Die neue Applikation soll alles
> vereinheitlichen und dafür bietet sich Qt an.

Das sollte mit einer Pythonlösung doch gehen, ich glaube hier scheint es 
ein XY Problem zu geben.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da es Qt auch für Python gibt, stellt sich die Frage nach "Python oder 
Qt" doch gar nicht.

Oliver

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.