2008-09-20 7 views
8

Quando compiliamo una dll usando __stdcall all'interno di visual studio 2008, i nomi delle funzioni compilati all'interno della dll lo sono.GCC che compila una dll con __stdcall

FunctionName

Anche se quando si compila la stessa DLL utilizzando GCC utilizzando WX-dev-cpp GCC aggiunge il numero di paramers la funzione ha, in modo che il nome della funzione utilizzare Dependency Walker assomiglia.

FunctionName @ numberOfParameters o == FunctionName @ 8

Come dite compilatore GCC per rimuovere @nn da simboli esportati nel dll?

risposta

5

__stdcall decora il nome della funzione aggiungendo un trattino basso all'inizio e il numero di byte di parametri alla fine (separati da @).

Quindi, una funzione:

void __stdcall Foo(int a, int b); 

... sarebbe diventato _foo @ 8.

Se si elenca il nome della funzione (non decorato) nella sezione ESPORTA del file .DEF, questo viene esportato non decorato.

Forse questa è la differenza?

+0

Grazie a roger per la risposta, si è scoperto che il problema era che un altro sviluppatore ha inserito un file DEF nel progetto. Questo file DEF diceva al linker le convenzioni di denominazione da usare all'interno della DLL. Questo è il motivo per cui stavamo ottenendo un nome di libreria diverso anche con la stessa convenzione di chiamata. La soluzione risultò che uno dei nostri sviluppatori aveva rimosso WINAPI dal file di intestazione quando creava la sua DLL per un progetto. Ciò ha fatto sì che Windows Visual Studio tornasse alla sua convenzione di chiamata predefinita di __cdecl (/ Gd). – Chad

0

È inoltre possibile utilizzare -Wl,--add-stdcall-alias per le opzioni di linker in GCC. Ciò garantirà che entrambi i nomi delle funzioni (decorati e non decorati) siano presenti e possano essere utilizzati come alias.

+0

Grazie Matthias non lo sapeva. – Chad