Problem mit dev
-
bsp, es ist ja weihnachten :xmas1:
// compiler einstellungen -DBUILDING_DLL=1 // linker --no-export-all-symbols --add-stdcall-alias // dll.h #ifndef DLL_H_ #define DLL_H_ #if BUILDING_DLL #define DLLIMPORT __declspec(dllexport) #else #define DLLIMPORT __declspec(dllimport) #endif DLLIMPORT void HelloWorld(); #endif // dll.c #include "dll.h" #include <windows.h> void HelloWorld() { MessageBox(0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION); } // -------------------------------------------------- // linker libdll.a // main.cpp #include <iostream> extern "C" // falls deine projekt in c ist kannst du dir extern schenken { #include "dll.h" } int main(int argc, char *argv[]) { HelloWorld(); system("PAUSE"); return 0; }
gutes hilfsmittel für dll's http://www.dependencywalker.com/
-
Ah! Also WINAPI schenkst da indemst du --add-stdcall-alias sollte aber aufs gleiche kommen...
Aber das hier ist interessant... DLLIMPORT ...Du musst also in dem static library declspec(dllimport) angeben? Das wird mein fehler sein oder? Nah ich werds mal probieren! Danke jedenfalls!
Das mit extern "C" ist auch ein netter trick, hab ich ned gewusst!
Dependency Walker hab ich eh, aber die website schaut stark nach na neuen version aus! (Gleich mal ausprobieren...)
Ich benutz auch gern den PE-Viewer, der ist besonders gut um ein bisschen asm zu üben.
MFG Manuelh87
-
Sorry , hab da blödsinn geschrieben... bin aber grad am probieren.. ich glaub die --no-export... und --add-sdtcall-alias sind die ausschlaggebenden...
Nur funktioniert das dann auch mit einer dll von einem anderen compiler der nur die funktionen ohne @ und so hat? es soll nämlich unbedingt mit der dll funktionieren... Aber du hast mich jetzt auf ein paar neue ideen gebracht... Danke jedenfalls
mfg Manuelh87
-
ne! Hat leider nicht funktioniert!
ICh brauch folgendes:
die dll muss verwendet werden, die dll muss funktionen als sdtcall haben (sonst trouble mit vb), ich muss die dll von lcc verwenden können.Ich möchte ein static library wie bei opengl (z.b.) machen sodass die projekte die ich mit der engine machen möchte in c++ nur die libsge.a einbinden und die header definieren. es soll aber weiterhin die dll benutzt sein, so wie bei opengl...
sorry aber mit deinem vorschlag hat das ned ganz so funktioniert, aber ich probier nochmal deinen code den bis jetzt hab ichs nur mit dem eigenen probiert.
mfg MAnuelh87
-
AH! Habs endlich kapiert..... man muss die lib___.a von dem dll build nehmen und nicht ne static biblo nehmen.. bin auch echt n idi.. bei na statischen biblo wird natürlich keine dll verwendet. Aber wie mach ich das jetzt mit der dll bei lcc? das wird wahrscheinlich ned ganz gehn oder? Nach ich probier mal rum und sag euch dann bescheid!
MFG Manuelh87
-
weis nicht was lcc benötigt aber wenn du statt ner *.a ne *.lib brauchst
musst du--output-lib *.lib
zu den linkereinstellungen hinzufügen.
dann musst du halt die lib linken.
-
Ne ich hab jetzt ne bessere beschreibung für das eigentliche Problem.
Lassen wir mal lcc völlig weg! Wenn ich meine Mini-dummi-Engine mit dev-cpp kompiliere nem ich mal ein def file.
Gehen wir davon aus das ich nur die Funktion StartDemo exportiere!
Dann sieht mein code so aus://header.h //compiler-para.: --no-export-all-symbols --def mydef.def #include ..... void WINAPI __declspec(dllexport) StartDemo(void);
//main.cpp void WINAPI __declspec(dllexport) StartDemo(void) { ... }
mydef.def:
{
bla bla
bla bla
EXPORTS
StartDemo=_Z16StartDemo@0.2 (Was auch immer) @ 1;
}so nun erstellt er auch brav ne dll mit dem entry StartDemo @ 1 also genau das was ich will. Es ist auch WINAPI=__stdcall damit kanns auch vb laden und Der name ist auch einfach (ohne Z123_+@28 oder so).
so nun ist meine frage wie kann ich die lib mit dem header includen?
also ich mach da ne neue header (ist ned nötig aber wurscht)
//header.h /*compiler-para.: -lNameVonMeinem .a File (im verzeichniss von devcpp) --def mydef.def */ __declspec(dllimport) void WINAPI StartDemo(void);
und im main file
#include ... void main(void) { StartDemo(); }
und er find dann die Referenzen ned... weil er nach den Z16_funktion@67 sucht! Ich find das irgendwie blöd das ma das mit den Zq4@43 ned ausschalten kann.... aber vielleicht kennst ja nen trick oder so... Jedenfalls ist das mein eigentliches Problem...
Naja forhes neues Jahr
Manuelh87
-
eigentlich bräuchtest du kein def file. probiere es mal ohne.
-
Ja! Ohne def file gehts natürlich aber dann sind die Funktionsnamen der Aufrufkonvegation entsprechend abgeändert und das will ich ja nicht...
Das hab ich eh auch schon probiert und das hat auch super funktioniert aber ich will dass die Funktionsnamen in der Dll ohne der Aufrufkonvegation dortstehen... Das is ja genau das was mich beim dev angeht! Das er die immer automatisch hinzufügt! Wenn das ned wär und er noch dll mit sections machen könnt wäre er mein absoluter liebling von den compilern. (Obwohl eigentlich ist er eh mein lieblings compilersystem sprich lieblingside!)Naja vielleicht weiß ja noch jemand wie das geht! Irgendwie muss der das ja checken!
MFG Manuelh87
-
gcc erlaubt es, den assmbler namen, den eine funktion oder eine statische variable hat, direkt zu spezifizieren.
int foo asm ("myfoo") = 2; extern int func (int x) asm ("FUNC"); int func (int x) { return x; };
GCC Manual 5.37
das sind dann auch die namen, wie sie dem linker bekannt sind.