Compartilhar via


Erro das ferramentas de vinculador LNK2031

não é possível gerar p/invoke para decorated_name "function_declaration"; convenção de chamada ausente em metadados

Comentários

Ao tentar importar uma função nativa para uma imagem pura, lembre-se de que as convenções de chamada implícitas diferem entre compilações nativas e puras. Para obter mais informações sobre imagens puras, consulte Código puro e verificável (C++/CLI).

A opção do compilador /clr:pure foi preterida no Visual Studio 2015 e está sem suporte no Visual Studio 2017.

Exemplos

Este exemplo de código gera um componente com uma função exportada, nativa, cuja convenção de chamada é implicitamente __cdecl.

// LNK2031.cpp
// compile with: /LD
extern "C" {
   __declspec(dllexport) int func() { return 3; }
};

O exemplo a seguir cria um cliente puro que consome a função nativa. No entanto, a convenção de chamada em /clr:pure é __clrcall. O exemplo a seguir gera o erro LNK2031.

// LNK2031_b.cpp
// compile with: /clr:pure LNK2031.lib
// LNK2031 expected
extern "C" int func();

int main() {
   return func();
}

O exemplo a seguir mostra como consumir a função nativa de uma imagem pura. Observe o especificador de convenção de chamada explícita __cdecl.

// LNK2031_c.cpp
// compile with: /clr:pure LNK2031.lib
extern "C" int __cdecl func();

int main() {
   return func();
}