Gibt es eine Möglichkeit c zu unterdrücken ++ Namen Mangeln?
-
05-09-2019 - |
Frage
Ich habe eine DLL, die in C ++ geschrieben ist und ich möchte den Namen für ein paar exportierten Methoden Mangeln zu unterdrücken. Die Methoden sind global und sind nicht Mitglieder einer Klasse. Gibt es eine Möglichkeit, dies zu erreichen?
BTW: Ich bin mit VS2008.
Lösung
„bradtgmurray“ ist richtig, aber für Visual C ++ Compiler, müssen Sie explizit sowieso Ihre Funktion exportieren. Aber mit einer DEF-Datei wie vorgeschlagen „Serge - appTranslator“. Ist der falsche Weg, es zu tun
Was ist die universelle Art und Weise Symbole auf Visual C ++ zu exportieren?
Mit dem declspec (dllexport / dllimport) Anweisung, die sowohl für C und C ++ Code funktioniert, verziert oder nicht (während der .DEF beschränkt sich auf C, wenn Sie Ihren Code von Hand dekorieren wollen).
Also der richtige Weg undecorated Funktionen in Visual C ++ exportieren, um den Export "C" Idiom Kombination, wie "bradtgmurray" beantwortet, und das Dllimport / Dllexport Stichwort.
Ein Beispiel?
Als Beispiel habe ich auf Visual C ++ ein leeres DLL-Projekt, und schrieb zwei Funktionen, eine synchronisierte CPP, weil sie eingerichtet wurde, und der andere C, weil es nicht war. Der Code lautet:
// 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) ;
} ;
Ich glaube, Sie bereits wissen, aber der Vollständigkeit halber ist das MY_DLL_API Makro in der DLL-Make-Datei definiert werden (das heißt die vcproj), aber nicht von DLL-Benutzer.
Der C ++ Code ist einfach zu schreiben, aber der Vollständigkeit halber, werde ich es unten schreiben:
// 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 ;
}
} ;
Andere Tipps
umgibt die Funktionsdefinitionen mit extern "C" {}
extern "C" {
void foo() {}
}
Siehe http://www.parashift.com /c++-faq-lite/mixing-c-and-cpp.html
Sie können alle manglings vermeiden (C ++, cdecl, stdcall, ...) für exportierte Funktionen eine DEF-Datei mit einem Exportabschnitt verwendet wird. Erstellen Sie einfach eine MyDll.def Datei und fügen Sie es zu einem Projekt:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
Eigentlich sind die Chancen der Assistent bereits eine def-Datei für Sie erstellt. Sie müssen nur in dem Exportabschnitt füllen.