Linker Tools Error LNK2031
The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.
The latest version of this topic can be found at Linker Tools Error LNK2031.
unable to generate p/invoke for "function_declaration" decorated_name; calling convention missing in metadata
When attempting to import a native function into a pure image, remember that the implicit calling conventions differ between native and pure compilations. For more information about pure images, see Pure and Verifiable Code (C++/CLI).
This code sample generates a component with an exported, native, function whose calling convention is implicitly __cdecl.
// LNK2031.cpp
// compile with: /LD
extern "C" {
__declspec(dllexport) int func() { return 3; }
};
The following sample creates a pure client that consumes the native function. However, the calling convention under /clr:pure is __clrcall. The following sample generates LNK2031.
// LNK2031_b.cpp
// compile with: /clr:pure LNK2031.lib
// LNK2031 expected
extern "C" int func();
int main() {
return func();
}
The following sample shows how to consume the native function from a pure image. Note the explicit __cdecl calling convention specifier.
// LNK2031_c.cpp
// compile with: /clr:pure LNK2031.lib
extern "C" int __cdecl func();
int main() {
return func();
}