2008-09-20 10 views
8

Wenn wir eine DLL mit __stdcall in Visual Studio 2008 kompilieren, sind die kompilierten Funktionsnamen in der DLL.GCC Kompilieren einer DLL mit __stdcall

Function

Obwohl, wenn wir die gleiche DLL mit GCC mit WX-dev-cpp GCC Hängt die Anzahl der paramers die Funktion hat, so der Name der Funktion Dependency Walker kompilieren aussieht.

Function @ numberOfParameters oder == Function @ 8

Wie sagen Sie GCC-Compiler von exportierten Symbole in der DLL entfernen @nn?

Antwort

5

__stdcall schmückt den Funktionsnamen durch Hinzufügen eines Unterstrichs zum Anfang und der Anzahl der Bytes der Parameter bis zum Ende (getrennt durch @).

So eine Funktion:

void __stdcall Foo(int a, int b); 

... würde _foo @ 8.

Wenn Sie den Funktionsnamen (undecorated) im Abschnitt EXPORTS Ihrer DEF-Datei aufführen, wird er undekoriert exportiert.

Vielleicht ist das der Unterschied?

+0

Danke roger für die Antwort, es stellte sich heraus, dass das Problem war, dass ein anderer Entwickler eine DEF-Datei in das Projekt platziert. Diese DEF-Datei teilte dem Linker die Namenskonventionen mit, die in der DLL verwendet werden sollten. Dies ist der Grund, warum wir einen anderen Bibliotheksnamen selbst mit derselben Aufrufkonvention erhalten haben. Die Lösung stellte sich heraus, dass einer unserer Entwickler WINAPI aus der Header-Datei entfernt hatte, als er seine eigene DLL für ein Projekt erstellte. Dies führte dazu, dass Windows Visual Studio auf die Standard-Aufrufkonvention von __cdecl (/ Gd) zurückgesetzt wurde. – Chad

0

Sie auch -Wl,--add-stdcall-alias zu Ihren Linker-Optionen in GCC verwenden können. Dies stellt sicher, dass beide Funktionsnamen (dekoriert und undekoriert) vorhanden sind und als Alias ​​verwendet werden können.

+0

Danke Matthias wusste das nicht. – Chad