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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top