Linker Tools Error LNK2031
unable to generate p/invoke for "function_declaration" decorated_name; calling convention missing in metadata
Remarks
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).
The /clr:pure compiler option is deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.
Examples
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();
}