2008-09-20 15 views
8

Cuando compilamos un dll usando __stdcall dentro de visual studio 2008, los nombres de las funciones compiladas dentro del dll son.GCC compilando un dll con __stdcall

nombrefunción

Aunque cuando se compila la misma DLL usando GCC GCC usando WX-dev-cpp anexa el número de paramers tiene la función, por lo que el nombre de la función utilizando Dependency Walker se parece.

nombrefunción @ numberOfParameters o == nombrefunción @ 8

, ¿cómo saber compilador GCC para eliminar @nn de símbolos exportados en el archivo DLL?

Respuesta

5

__stdcall decora el nombre de la función agregando un guion bajo al inicio y el número de bytes de parámetros hasta el final (separados por @).

Por lo tanto, una función:

void __stdcall Foo(int a, int b); 

... se convertiría en _foo @ 8.

Si lista el nombre de la función (sin decorar) en la sección EXPORTACIONES de su archivo .DEF, se exporta sin decorar.

Quizás esta es la diferencia?

+0

Gracias a Roger por la respuesta, resultó que el problema era que otro desarrollador colocaba un archivo DEF en el proyecto. Este archivo DEF le dijo al vinculador las convenciones de nombres para usar dentro de la DLL. Esta es la razón por la cual obtuvimos un nombre de biblioteca diferente incluso con la misma convención de llamadas. La solución resultó que uno de nuestros desarrolladores había eliminado WINAPI del archivo de encabezado al crear su propia DLL para un proyecto. Esto hizo que Windows visual studio volviera a su convención de llamada predeterminada de __cdecl (/ Gd). – Chad

0

También puede utilizar -Wl,--add-stdcall-alias a sus opciones de conexión, en GCC. Esto asegurará que ambos nombres de funciones (decorados y no decorados) estén presentes y se puedan usar como alias.

+0

Gracias Matthias no sabía esto. – Chad