¿Hay una manera de suprimir C ++ renombrado de nombres?
-
05-09-2019 - |
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.
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.