2012-11-14 15 views
5

mam kawałek kodu, który ma następującą linięnazwa 64bit maglowania dla C++

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

Projekt, który wykorzystuje ten kod działa poprawnie, gdy mogę skompilować kod przy użyciu C++ Visual Studio 2010 z typu konfiguracja 32bit (I jestem również na 32-bitowym komputerze z systemem Windows).

pojawia się błąd łącza, kiedy zmienić maszynę do 64bit i użyć konfiguracji x64 który kompilacji z C++ Visual Studio 2010.

Czy C++ przekręcona nazwa inna dla 32bit vs 64bit? Jeśli tak, to gdzie mogę znaleźć 64-bitowe konwencje mangowania nazw C++?

Odpowiedz

7

Tak, nazwa wymieszania różni się od 32 do 64 bitów. Rozsądnym artykułem obejmującym dokładne formaty może być found here. Możesz dość szybko odróżnić główne różnice, ale po prostu kup kompilowanie obu celów i sprawdzanie wynikowych plików map. Z mojego doświadczenia wynika, że ​​są one prawie identyczne (64-bitowe dodaje małe dane, potencjalnie zmienia inne).

Prosta próba: void foo();

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

przypadku nie zniekształcone połączenia std długość sufiks może znacznie różnić się, w zależności od zastosowania parametrów stosu. Domyślne 64-bitowe ustawienia dla VC++ nie poprzedzają podkreśleń, ani nie kodują przyrostków długości. Poniższa został skompilowany zarówno 32/64bit configs z czystych out-of-the-box ustawienia:

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

32bit: [email protected] 
64bit: func2 

Nie ma sensu tam, tam jest.

Zakończenie obwodu, unmangled _cdecl, który to robi:

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

32bit: _func2 
64bit: func2 

Jeśli wydaje się, że oni wychodzili z siebie, aby wiedzieć, co masz ciągnąc się lub eksportowania-out, dowody sugerują, prawdopodobnie masz rację.

+0

To może być zupełnie inaczej ... Jeśli 'test' otrzyma trzy parametry wskaźnika, zmieni się z" 12 "na" 24 "... Ah, również nie jest to funkcja C++. Wydaje się, że jest to funkcja 'stdcall' C. – ybungalobill

+0

gdzie mogę się o tym dowiedzieć. Jestem nowy w tych koncepcjach. również myślę, że moje jest stdcall i przykład podałeś jest dla cdecl. Mam kilka innych połączeń, takich jak komentarz #pragma (linker, "/ export: test @ 0 = test"), jak powinienem je zmienić. odniesienie, które je wyjaśni, będzie wspaniałe. – user1612986

+0

Istnieje wiele dokumentów dotyczących mangowania nazw w C++ (jeden z nich podłączyłem). Wygląda na to, że używasz extern "C" _stdcall dla eksportu, co, jak pokazano powyżej, różni się w 32.vs.64-bitach. Są artykuły dosłownie na całym MS i Wiki. Chociaż związane z VB, podoba mi się [ten post] (http://msdn.microsoft.com/en-us/library/dt232c9t (v = vs.71) .aspx), ponieważ robi to przyzwoicie. Tak czy inaczej, będziesz musiał oczyścić #pragmas na #ifdef WIN64 i albo zaimportować lub wyeksportować odpowiednie nazwy, obawiam się. – WhozCraig