Est-il possible de supprimer c ++ nom mutiler?
-
05-09-2019 - |
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.
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.