Pregunta

Tengo un archivo DLL que está escrito en C ++ y quiero suprimir el nombre mangling durante unos métodos exportados. Los métodos son globales y no son miembros de ninguna clase. ¿Hay una manera de lograr esto?

Por cierto: estoy usando VS2008.

¿Fue útil?

Solución

"bradtgmurray" es correcto, pero para los compiladores de C ++ Visual, necesita exportar explícitamente su función de todos modos. Pero el uso de un archivo .def como propone "Serge - appTranslator". Es la manera equivocada de hacerlo

¿Cuál es la forma universal a exportar símbolos en Visual C ++?

Uso de la (/ dllimport dllexport) de instrucciones, que funciona tanto para el código C y C ++, decorado o no declspec (mientras que, el .def se limita a C, a menos que desea decorar su código a mano).

Por lo tanto, de la manera correcta para exportar funciones sin decorar en Visual C ++ es la combinación de la exportación lenguaje "C", como respondida por "bradtgmurray", y la palabra clave dllimport / dllexport.

Un ejemplo?

A modo de ejemplo, he creado en Visual C ++ un proyecto DLL vacío, y escribió dos funciones, una apodado CPP, ya que estaba decorado, y el otro C, ya que no lo era. El código es:

// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;

// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;

Te supongo que ya lo sé, pero por el bien integridad, la macro MY_DLL_API ha de ser definido en el archivo MAKE DLL (es decir, el vcproj), pero no por los usuarios DLL.

El código C ++ es fácil de escribir, pero por el bien integridad, voy a escribir a continuación:

// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
   return 42 * v ;
}

extern "C"
{

// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
   return 42 * v ;
}

} ;

Otros consejos

rodean las definiciones de funciones con extern "C" {}

extern "C" {
    void foo() {}
}

http://www.parashift.com /c++-faq-lite/mixing-c-and-cpp.html

Puede evitar todos manglings (C ++, cdecl, stdcall, ...) para funciones exportadas mediante un archivo .def con una sección de exportaciones. Basta con crear un archivo MyDll.def y añadirlo a su proyecto:

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

En realidad, es probable que el asistente ya se creó un archivo de definición para usted. Sólo tienes que rellenar la sección de exportaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top