mueslirocker
Mitglied
Hi!
Ich arbeite (wie immer
) mit cygwin und nutze entsprechend den GNU Compiler gcc bzw g++.
Ich habe viel gelesen´und der Bau einer DLL ist ja nicht schwer, aber mir sind zwei Dinge nicht klar geworden.
Vorweg wie ich kompiliere und linke:
gcc -c dllname.cpp
g++ -shared -o dllname.dll dllname.o
Wenn ich mir die DLL nun anschaue und nach meinen Funktionsnamen suche, finde ich sie zwar, aber es wurden Buchstaben hinzugefügt.
Die Funktion "test" heißt z.B. "_Z11testi".
Wenn ich das richtig sehe, ist das Präfix immer _Z<eineZahl> und das Postfix entweder "i" oder "PKcmPcm"... kann aber auch sein, dass es nur bei den Beispielen, die ich mir angeschaut habe, so ist.
Ich habe gelesen, dass man ein DEF-File bauen kann, in dem dann "EXPORTS test@1" stehen soll.
Ich weiß aber nicht, wie ich dieses DEF-File beim Linken einbringen soll.
Ferner habe ich gelesen, dass man aus einer DLL ein DEF-File generieren kann. Und aus der DLL und der DEF eine andere Bibliothek (.a) bauen kann.
(echo EXPORTS > foo.def
nm foo.dll | grep ' T _' | sed 's/.* T _//' >> foo.def
dlltool --def foo.def --dllname foo.dll --output-lib foo.a)
Ich habe mir einfach mal ein DEF-File bauen lassen und reingeschaut und dabei ist mir aufgefallen, dass wirklich alle Funktionen, die in meinem Programm (oder dessen Header) auftauchen, exportiert werden... aber nicht alle bekommen ein "@<eineZahl>".
Ist diese Zahl hinter dem @ der Einstiegpunkt?
Das bringt mich zu meiner zweiten Frage.
Wie kann ich bestimmen, welche Funktionen exportiert werden, und welche nicht?
Achso, damit nur bestimmte Funktionen exporiert werden, habe ich diese mit "__declspec(dllexport)" versehen.
Scheint dem Linker aber egal zu sein.
Ich habe das Gefühl, als dürfte ich nicht mit dem Parameter -shared arbeiten..
Es ist auch so, dass ich mit einem anderen C-Programm, das beim Linken die DLL einbindet, und einen entsprechenden Header hat ("__declspec(dllimport)"), die Funktionen mit ihrem normalen Namen benutzen kann, aber ich möchte die DLL nicht nur in C-Programmen einbauen und die DLL auch weiter geben und dafür möchte ich schon die selbstgebaute DEF-Datei mit den sprechenden Namen benutzen und auch die Einstiegspunkte (also die Zahlen hinter dem @.. sind das die Einstiegspunkte?) bestimmen.
Kann mir jemand helfen?
Ich arbeite (wie immer

Ich habe viel gelesen´und der Bau einer DLL ist ja nicht schwer, aber mir sind zwei Dinge nicht klar geworden.
Vorweg wie ich kompiliere und linke:
gcc -c dllname.cpp
g++ -shared -o dllname.dll dllname.o
Wenn ich mir die DLL nun anschaue und nach meinen Funktionsnamen suche, finde ich sie zwar, aber es wurden Buchstaben hinzugefügt.
Die Funktion "test" heißt z.B. "_Z11testi".
Wenn ich das richtig sehe, ist das Präfix immer _Z<eineZahl> und das Postfix entweder "i" oder "PKcmPcm"... kann aber auch sein, dass es nur bei den Beispielen, die ich mir angeschaut habe, so ist.
Ich habe gelesen, dass man ein DEF-File bauen kann, in dem dann "EXPORTS test@1" stehen soll.
Ich weiß aber nicht, wie ich dieses DEF-File beim Linken einbringen soll.
Ferner habe ich gelesen, dass man aus einer DLL ein DEF-File generieren kann. Und aus der DLL und der DEF eine andere Bibliothek (.a) bauen kann.
(echo EXPORTS > foo.def
nm foo.dll | grep ' T _' | sed 's/.* T _//' >> foo.def
dlltool --def foo.def --dllname foo.dll --output-lib foo.a)
Ich habe mir einfach mal ein DEF-File bauen lassen und reingeschaut und dabei ist mir aufgefallen, dass wirklich alle Funktionen, die in meinem Programm (oder dessen Header) auftauchen, exportiert werden... aber nicht alle bekommen ein "@<eineZahl>".
Ist diese Zahl hinter dem @ der Einstiegpunkt?
Das bringt mich zu meiner zweiten Frage.
Wie kann ich bestimmen, welche Funktionen exportiert werden, und welche nicht?
Achso, damit nur bestimmte Funktionen exporiert werden, habe ich diese mit "__declspec(dllexport)" versehen.
Scheint dem Linker aber egal zu sein.
Ich habe das Gefühl, als dürfte ich nicht mit dem Parameter -shared arbeiten..
Es ist auch so, dass ich mit einem anderen C-Programm, das beim Linken die DLL einbindet, und einen entsprechenden Header hat ("__declspec(dllimport)"), die Funktionen mit ihrem normalen Namen benutzen kann, aber ich möchte die DLL nicht nur in C-Programmen einbauen und die DLL auch weiter geben und dafür möchte ich schon die selbstgebaute DEF-Datei mit den sprechenden Namen benutzen und auch die Einstiegspunkte (also die Zahlen hinter dem @.. sind das die Einstiegspunkte?) bestimmen.
Kann mir jemand helfen?