Pregunta

Así es como he declarado mi función de exportación en el momento:

extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();

Cuando VS2008 compilado la fuente para esto, la DLL producido contiene este bajo su tabla de exportación:

_GetExported_Class@0

Para la compatibilidad con otros compiladores necesito la decoración de arriba para tener este lugar:

GetExported_Class

Cambio de la convención de llamada a __cdecl va a decorar a la forma que yo quiero pero la convención sería un error así que no puedo usar eso. Lo necesito para decorar la forma en apariencia, pero __cdecl usos __stdcall lugar.

¿Hay alguna forma de hacer esto sin con un archivo .def? ¿Hay un interruptor o una opción que pueda pasar al enlazador link.exe que puede hacer que decorar el nombre de exportación de la manera que quiero?

Gracias

¿Fue útil?

Solución

No. Todos los nombres de __stdcall están decoradas de esta manera. Estoy sorprendido de que usted tiene algún otro compilador que no va a esperar __stdcall exportaciones a ser decorado como este. Anulación del enlazador con .def es más o menos todo lo que puede hacer-a menos que desee alterar el archivo PE después de la producción.

Otros consejos

No entiendo por qué no se desea utilizar un archivo .def, pero esta es su única opción.

El enlazador soporta un interruptor de exportación, pero no se puede utilizar con las funciones que están anotados __stdcall:

http://msdn.microsoft.com/en-US/library/ 7k30y2k5.aspx

La forma de archivo de definición es prácticamente la única solución.

Sí:

Se puede añadir /EXPORT a la línea de comandos lib.exe, o añadir un #pragma a su archivo fuente:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

O incluso más fácil: En el interior del cuerpo de la utilización de función

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

Fuente: https://stackoverflow.com/a/2805560/280534

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