2012-11-14 15 views
5

ich ein Stück Code haben, der die folgende Zeile hat64-Bit-Namen für c Mangeln ++

#pragma comment(linker, "/include:[email protected]") 

Das Projekt, das diesen Code verwendet funktioniert gut, wenn ich den Code unter Verwendung von C++ Visual Studio 2010 mit Konfigurationstyp 32bit (I kompilieren Bin auch auf einer 32 Bit Windows Maschine).

Ich erhalte einen Verbindungsfehler, wenn ich die Maschine auf 64-Bit ändern und x64-Konfiguration, die mit C Kompilieren verwenden ++ Visual Studio 2010.

C++ Name für 32bit vs 64bit verschiedene Mangeln? Wenn ja, wo finde ich die 64-Bit-C++ - Namens-Mangling-Konventionen?

Antwort

7

Ja der Name Mangling unterscheidet sich zwischen 32 und 64 Bit. Ein vernünftiger Artikel über die genauen Formate kann found here sein. Sie können die Hauptunterschiede jedoch ziemlich schnell erkennen, indem Sie einfach beide Ziele kompilieren und die resultierenden Kartendateien untersuchen. Aus meiner Erfahrung sind sie fast identisch (64bit fügt ein kleines Datum hinzu, ändert möglicherweise andere).

einfaches Beispiel: void foo();

32bit: [email protected]@@QAEXXZ 
64bit: [email protected]@@QEAAXXZ 

Für nicht verstümmelten std Anruf, kann die Länge Suffix wesentlich verschieden sein, je nach dem Parameterstapel Nutzung. Die Standard-64-Bit-Einstellungen für VC++ sind keine Unterstriche vorangestellt, noch codiert es Längen-Suffixe. Folgendes wurde zusammengestellt, beide 32/64bit configs mit reinem out-of-the-Box-Einstellungen:

extern "C" int _stdcall func2(int, int, char*); 

32bit: [email protected] 
64bit: func2 

nicht viel Sinn, dort gibt es.

Abschließen der Schaltung, unmangled _cdecl, die dies tut:

extern "C" int _cdecl func2(int, int, char*); 

32bit: _func2 
64bit: func2 

Wenn es, wie sie Sie kennen zu machen ging aus dem Weg scheint, was Sie ziehen sich an oder Export-out Anzeichen dafür, Du hast wahrscheinlich Recht.

+0

Es kann eigentlich ganz anders sein ... Wenn 'test' drei Zeigerparameter empfängt, ändert es sich von' 12' nach '24' ... Ah, auch dies ist keine C++ Funktion. Es scheint eine 'stdcall' C Funktion zu sein. – ybungalobill

+0

wo kann ich darüber lernen. Ich bin neu in diesen Konzepten. ich denke auch, dass meins ein stdcall ist und das Beispiel, das du gabst, ist für cdecl. Ich habe einige andere Anrufe wie #pragma Kommentar (Linker, "/ Export: Test @ 0 = Test") Wie sollte ich diese ändern. Eine Verdeutlichung dieser wird großartig sein. – user1612986

+0

Es gibt eine Vielzahl von Dokumenten über C++ - Name Mangling (ich habe Sie eine von ihnen verknüpft). Sie scheinen extern "C" _stdcall für Ihre Exporte zu verwenden, die sich, wie oben gezeigt, in 32.vs.64-Bit unterscheiden. Es gibt Artikel buchstäblich überall in MS und Wiki. Obwohl VB-bezogen, mag ich [diesen Beitrag] (http://msdn.microsoft.com/en-us/library/dt232c9t (v = vs.71) .aspx), da es eine anständige Arbeit davon macht, darüber zu sprechen. Auf die eine oder andere Weise müssen Sie Ihre #pragmas auf #ifdef WIN64 aufräumen und die entsprechenden Namen importieren oder exportieren, fürchte ich. – WhozCraig