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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top