C'è un modo per sopprimere C ++ nome storpiatura?
-
05-09-2019 - |
Domanda
Ho una DLL che è scritto in C ++ e voglio sopprimere il nome pressare per un paio di metodi esportati. I metodi sono globali e non sono membri di qualsiasi classe. C'è un modo per raggiungere questo obiettivo?
A proposito: sto usando VS2008.
Soluzione
"bradtgmurray" è giusto, ma per visivi compilatori C ++, è necessario esportare in modo esplicito la funzione in ogni caso. Ma usando un file DEF come proposto da "Serge - appTranslator". È il modo sbagliato per farlo
Qual è il modo universale per esportare i simboli su Visual C ++?
Uso della declspec (/ dllimport dllexport) di istruzioni, che funziona sia per il codice C e C ++, decorato o no (mentre, il DEF è limitata a C a meno che non si vuole decorare il vostro codice a mano).
Quindi, il modo giusto per esportare le funzioni non decorati in Visual C ++ sta combinando l'esportazione linguaggio "C", come risposta da "bradtgmurray", e la parola chiave dllimport / dllexport.
Un esempio?
Per fare un esempio, ho creato su Visual C ++ un progetto DLL vuoto, e ha scritto due funzioni, uno soprannominato CPP perché è stato decorato, e l'altro C perché non era. Il codice è:
// 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) ;
} ;
Credo che già so, ma per completezza, la macro MY_DLL_API deve essere definita nella DLL makefile (vale a dire la VCPROJ), ma non dagli utenti DLL.
Il codice C ++ è facile da scrivere, ma per completezza, lo scrivo qui di seguito:
// 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 ;
}
} ;
Altri suggerimenti
circondare le definizioni di funzione con extern "C" {}
extern "C" {
void foo() {}
}
http://www.parashift.com /c++-faq-lite/mixing-c-and-cpp.html
Si può evitare tutte le manglings (C ++, cdecl, stdcall, ...) per le funzioni esportate utilizzando un file .def con una sezione ESPORTAZIONI. Basta creare un file MyDll.def e aggiungerlo al progetto:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
In realtà, è probabile che la procedura guidata già creato un file def per voi. Devi solo compilare nella sezione EXPORTS.