Question

J'ai une DLL qui est écrit en C ++ et je veux supprimer le nom mutiler pour quelques méthodes exportées. Les méthodes sont globales et ne sont pas membres d'une classe. Y at-il un moyen d'y parvenir?

BTW: J'utilise VS2008.

Était-ce utile?

La solution

« bradtgmurray » est juste, mais pour Visual C ++ compilateurs, vous devez exporter explicitement votre fonction de toute façon. Mais en utilisant un fichier .def tel que proposé par « Serge - appTranslator ». Est la mauvaise façon de le faire

Quel est le moyen universel d'exporter des symboles sur Visual C ++?

Utilisation du declspec (dllexport / dllimport) instruction, qui fonctionne à la fois C et C ++ code, décorée ou non (alors que, le .def est limité à C sauf si vous voulez décorer votre code à la main).

Alors, la bonne façon d'exporter des fonctions undecorated dans Visual C ++ est combinant l'idiome d'exportation "C", comme une réponse par "bradtgmurray", et le mot-clé dllimport / dllexport.

Un exemple?

À titre d'exemple, j'ai créé sur Visual C ++ un projet DLL vide, et a écrit deux fonctions, l'un surnommé RPC parce qu'il a été décoré, et l'autre C parce qu'il n'a pas été. Le code est:

// 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) ;
} ;

Je suppose que vous savez déjà, mais pour l'amour complet, la macro MY_DLL_API est à définir dans le makefile DLL (à savoir le vcproj), mais pas par les utilisateurs DLL.

Le code C ++ est facile à écrire, mais pour être complet bien, je vais écrire ci-dessous:

// 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 ;
}

} ;

Autres conseils

Entourez les définitions de fonctions avec extern "C" {}

extern "C" {
    void foo() {}
}

Voir http://www.parashift.com /c++-faq-lite/mixing-c-and-cpp.html

Vous pouvez éviter tous manglings (C ++, cdecl, stdcall, ...) pour les fonctions exportées à l'aide d'un fichier .def avec une section EXPORTS. Il suffit de créer un fichier MyDll.def et l'ajouter à votre projet:

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

En fait, les chances sont l'assistant déjà créé un fichier DEF pour vous. Il vous suffit de remplir la section EXPORTS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top