Problem mit dev
-
hab ein problem mit dev-cpp
folgendes:Kann mir jemand sagen wie ichs schaff ein static libary zu erstellen und in ein anderes Projekt einzubinden, aber so dass es die dll von dem library braucht! wegen dev-cpps (blöden) _@ Z1bdfj1 kann es nämlich die funktionen ned finden!
sagt immer undefined reference ...ich möcht das in der dll die funktionen gClearUp so bleiben wie sie jetzt sind (ohnen irgendwelche zeichen) (das krieg ich auch hin aber das mit dem static library ned)
BSP:
void WINAPI Cleanup (void);
also bei der static lib hab ich in moment
extern "C" /* die dll is in c*/ __declspec(dllexport) void WINAPI Cleanup(void);bei der header für den import hab ich:
extern "C" __declspec(dllimport) void WINAPI Cleanup (void);welche defs muss ich wo machen damit der devcpp das checkt???
Dev-cpp: Ist zwar echt super und so aber für dll builds find ich in echt blöd! Da muss ma hunderte sachen machen damit der die funktionen ganz normal exportiert ohnen irgendwelchen zeichen die auf die Parameter hinweißen hat. Und jetzt grad bin ich nahe am ausflippen weil ich nirgendst was find drüber...
! Aber ihr werdet mir ja sicher bald helfen damit ich wieder
sein kann!
Danke schon mal im vor raus!
Manuelh87
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum Andere Compiler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
beschäftige dich mal mit "Aufrufkonventionen"
lass das WINAPI weg.
-
WINAPI ist doch __stdcall und das beeinflusst den code! (Wer den stack aufräumt und so!) und ich will das es auch mit vb funktioniert. und vb checkt nur stdcall!
Das Problem liegt ja nur bei devcpp weil er immer diese zeichen hinzufügt und dann plötzlich irgendwie doch ned checkt... ich hab ja keine ahnung was da vorgeht... mit MSVC funktioniert ja sowas... nur da dev stellt sich da immer a bissal komisch an... ich hab ewig braucht bis ich den syntax vom devcpp und seinen dev-files checkt hab... und wie ma ein def file verwendet. Ist ned gut beschrieben und ich hab ma das zusammenreimen und ausprobieren müssen.
Wie gesagt: ich bin sehr zufrienden mit devcpp aber bei den builds von dlls und so könnt ich ausflippen....
kann mir das jemnd an einem beispiel zeigen wie ich das machen muss... oder vielleicht ein beispiel schicken auf Manuel_h87@yahoo.de? bitte bittenur eine biliothek die eine Funktion exportiert dazu eine dll mit dieser funktion und eine normale exe die die funktion importiert. Die exe muss dann aber auch wirklich die dll brauchen beim ausführen. (Das ist mir wichtig) denn anders hab ichs auch schon geschafft. ich möcht das so haben wie bei: libopengl32.a (z.b.)! Da braucht das prog auch nachher die dll opengl32.dll!
mfg Manuelh87
-
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.