Existe uma maneira para suprimir c ++ desconfiguração do nome?
-
05-09-2019 - |
Pergunta
Eu tenho uma DLL que é escrito em C ++ e eu quero suprimir o nome desconfiguração por alguns métodos exportados. Os métodos são globais e não são membros de qualquer classe. Existe uma maneira de conseguir isso?
BTW: eu estou usando VS2008.
Solução
"bradtgmurray" é certo, mas para compiladores Visual C ++, você precisa exportar explicitamente a função de qualquer maneira. Mas usando um arquivo .def como proposto por. "Serge - appTranslator" é a maneira errada de fazê-lo
O que é a maneira universal aos símbolos de exportação no Visual C ++?
Usando o declspec (dllexport / dllimport) instrução, que funciona tanto para C e código C ++, decoradas ou não (ao passo que, o .def é limitado a C a menos que você quer decorar o seu código à mão).
Assim, o caminho certo para exportar funções undecorated no Visual C ++ está combinando a exportação "C" idioma, como respondida por "bradtgmurray", eo dllimport / dllexport palavra-chave.
Um exemplo?
Como um exemplo, eu criei no Visual C ++ um projeto DLL vazio, e escreveu duas funções, uma apelidado CPP porque foi decorado, e outro C porque não era. O código é:
// 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) ;
} ;
Eu acho que você já sabe, mas Para ser completo, a macro MY_DLL_API deve ser definido no makefile DLL (ou seja, o vcproj), mas não pelos utilizadores DLL.
O código C ++ é fácil de escrever, mas Para ser completo, vou escrevê-lo abaixo:
// 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 ;
}
} ;
Outras dicas
Surround as definições de funções com extern "C" {}
extern "C" {
void foo() {}
}
http://www.parashift.com /c++-faq-lite/mixing-c-and-cpp.html
Você pode evitar todos os manglings (C ++, cdecl, stdcall, ...) para funções exportadas usando um arquivo .def com uma seção de exportações. Basta criar um arquivo MYDLL.DEF e adicioná-lo ao seu projeto:
LIBRARY "MyDLL"
EXPORTS
Foo
Bar
Na verdade, as chances são o assistente já criou um arquivo def para você. Você apenas tem que preencher a secção exportações.