DLL funktioniert nicht

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
double
Beiträge: 7
Registriert: 19. Dezember 2015 01:19

DLL funktioniert nicht

Beitrag von double »

Hallo,

ich wollte in QT(MinGW) eine DLL erstellen allerdings läuft diese nicht. Das Programm sagt Cannot call abc.dll.
Am Code kann es nicht liegen denn exakt der gleiche Code funktioniert wenn ich die DLL mit Visual Studio erstelle.

Gewählt habe ich in QT:
Biliothek -> C++-Bibliothek -> Dynamisch gebundene Bibibiothek
Die erzeugte DLL funktioniert nicht. Ich dachte es liegt evt am fehlenden stdafx.h und targetver.h aber diese dem Projekt per "Existierende Datei hinzufügen" hinzugefügt und auch keine Änderung.

Hat jemand eine Idee?

Gruß
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: DLL funktioniert nicht

Beitrag von RHBaum »

Aehm ja ....
Das Programm sagt Cannot call abc.dll
WIe ziehst du deine dll an ???
Ich hoffe doch mit loadLibrary !

Ich glaub hier fehlt ne ganze Menge Grundlagenwissen zum Thema Libraries.

Man kann Dlls mit ner exe verknüpfen ohne die Dll "manuell" zu laden. Das geht über Importlibs.
Der VC macht dir ne Menge auf Build - Ebene dabei ....
Mit nem gcc geht das theorethisch auch, nur muss man ne menge händich machen. (der gcc kommt von linux, da haben die dlls, aka so's (shared objects) nen eingebauten mechanismus zum ad-hoc laden, auf systemebene, unter windows gibts sowas nicht).
In der Natur einer Dll (laden entladen zur laufzeit) liegt aber eher das expliziete Laden ... mit loadLibrary und freeLibrary. Da entfalten sie ihr ganzes Potential ...

eine mit vs erstellte exe mit ner gcc erstellten Dll zu verheiraten geht nur auf den manuellen weg, und ohne C++ (hat kein Abi) sondern nur mit strikten C-Schnittstellen

Ciao ...
double
Beiträge: 7
Registriert: 19. Dezember 2015 01:19

Re: DLL funktioniert nicht

Beitrag von double »

Hallo, danke für die Antwort. Grundlagenwissen kann definitiv fehlen ich mache das nur als Hobby. Bisher hat aber alles funktioniert bis ich QT als IDE ausprobiert habe. Ich habe die dll testweise nochmal mit Code::Blocks compiliert und damit funktioniert es. Es muss also irgendeine Einstellung im QT Creator sein.

in dll c++:

Code: Alles auswählen

extern "C" __declspec (dllexport) double var(usw...)
{
}
in programm:

Code: Alles auswählen

#import "test.dll"
double var(usw...);
#import
dll per VS: -> Funktioniert
dll per Code::Blocks: -> Dynamic Link Library -> GNU GCC Compiler -> Funktioniert
dll per QT Creator: -> Biliothek -> C++-Bibliothek -> Dynamisch gebundene Bibibiothek -> MinGW 32bit -> Fehler!

Testweise habe ich bei QT eine statische Biblithek erstellt aber dann wird komischerweise gar keine dll erstellt sondern nur test.o und test.a.
Ich glaube das der Fehler nur irgendeine Einstellungssache in QT sein kann denn bei Visual Studio und Code::Blocks funktioniert die compilierte dll mit identischem Code ohne Probleme.

Gruß
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: DLL funktioniert nicht

Beitrag von RHBaum »

Noch mal zum mitschneiden .. :-)

die Dll erstellst du, in deinem projekt ?
das binary, wer erstellt das ? auch Du ? im Selben Project ?
dll per Code::Blocks: -> Dynamic Link Library -> GNU GCC Compiler -> Funktioniert
unter Linux ???
unter windows muesst er dir das ding auf den mingw (32???) mappen ...(eventuell nur anzeige sache).

dem Creator kannst ueber die qmakespec auch sagen, das er makefiles anlegen soll ...
die makes muesstest dann mit dem mingwmake ausführen und damit compilieren koennen.
Vielleicht hilfts da mal reinzuschauen, was der QTCreator so setzt, um auf den Unterschied zu kommen ...

Ciao ...
double
Beiträge: 7
Registriert: 19. Dezember 2015 01:19

Re: DLL funktioniert nicht

Beitrag von double »

RHBaum hat geschrieben:die Dll erstellst du, in deinem projekt ?
Ja dll in c++ selbst geschrieben und compiliert.
RHBaum hat geschrieben:das binary, wer erstellt das ? auch Du ? im Selben Project ?
Ist mit binary das Programm gemeint das die dll aufruft? Wenn ja, das Programm ist in C und könnte ich auch kompilieren, ist aber unverändert seit langem.
RHBaum hat geschrieben:unter Linux ???
unter windows muesst er dir das ding auf den mingw (32???) mappen ...(eventuell nur anzeige sache).
Alles in Windows. Code::Blocks zeigt das nur als GNU GCC Compiler an es ist dann aber schließlich die mingw32-g++.exe = also auch mingw genau.
double hat geschrieben:dem Creator kannst ueber die qmakespec auch sagen, das er makefiles anlegen soll ...
die makes muesstest dann mit dem mingwmake ausführen und damit compilieren koennen.
qmakespec, mingwmake... Begriffe in die ich mich jetzt wohl einlesen muss... :)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: DLL funktioniert nicht

Beitrag von RHBaum »

Ist mit binary das Programm gemeint das die dll aufruft?
genau ..
Also das nen C-Program, das du auch übersetzt / übersetzen kanns ....
WIe zieht dieses Prog/Binary die Dll an, kannst das mal fix posten ...
qmakespec, mingwmake
der QT-Creator steuert qmake.
Die QMakespec ist eigentlich ne Datei wo deine Toolchain (präprozessor, compiler linker utilities ) spezifizeiert sind.
ist aber auch ne Variable, die du auf nen definierten wert setzt, und qmake dann die richtige datei findet
Damit ist das ganze das synonym dafür, wie qmake mittels den sourcen zum fertig kompilierten "Produkt" kommt, wobei Produkt auch nen installer sein kann ^^
andere Buildgeneratoren haben das auch.
in boostBuild heisst das toolset
in cmake ist es der Generator ...

traditionell gibts ja kein "richtiges" make auf windows basis. die gnu toolchain für windows (Minimalist GNU for windows) bringt deshalb nen make mit. "Normal" heisst das aber nicht make.exe sondern mingwmake.exe. Man kann es umbenennen, dann funktionieren einige standard unix tools out of the box. die QMakeSpec sollte aber mingw auf windows plattformen kennnen und den Aufruf von make in mingwmake wandeln ...

Ciao ...
Antworten