Come faccio a cambiare la decorazione nome esportato per __stdcall in C ++?
-
12-10-2019 - |
Domanda
Questo è come io ho la mia funzione di esportazione dichiarata al momento:
extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();
Quando VS2008 compilato la fonte per questo, la dll prodotto contiene questo sotto la sua tabella di esportazione:
_GetExported_Class@0
Per la compatibilità con altri compilatori ho bisogno la decorazione sopra a guardare come questo, invece:
GetExported_Class
La modifica della convenzione di chiamata per __cdecl decoreranno al modo in cui voglio, ma la convenzione sarebbe sbagliato, quindi non posso usare quella. Ho bisogno di essere decorato gli sguardi __cdecl modo, ma usi __stdcall invece.
Esiste un modo per fare questo senza utilizzando un file .def? C'è un interruttore o un'opzione posso passare al linker Link.exe che può rendere decorare il nome di esportazione per il modo in cui voglio?
Grazie
Soluzione
No. Tutti i nomi __stdcall sono decorate in questo modo. Sono stupito che hai qualche altro compilatore che non si aspettano __stdcall esportazioni da decorare come questo. Override il linker con DEF è più o meno tutto quello che puoi fare- a meno che non si desidera modificare il file PE dopo la produzione.
Altri suggerimenti
Non capisco il motivo per cui non si desidera utilizzare un file DEF, ma questa è l'unica opzione.
Il linker supporta un interruttore di esportazione, ma non può essere utilizzata con funzioni che sono __stdcall annotati:
http://msdn.microsoft.com/en-US/library/ 7k30y2k5.aspx
Il modo in cui file di definizione è praticamente l'unica soluzione.
Si
È possibile aggiungere /EXPORT
alla riga di comando lib.exe
, o aggiungere un #pragma
per il file sorgente:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
O ancora più semplice: All'interno del corpo della funzione di utilizzo
#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)