Sdílet prostřednictvím


Chyba linkerů LNK2031

Nelze vygenerovat volání p/invoke pro function_declaration decorated_name; chybí konvence volání v metadatech

Poznámky

Při pokusu o import nativní funkce do čisté image nezapomeňte, že implicitní konvence volání se liší mezi nativními a čistými kompilacemi. Další informace o čistých obrázcích najdete v tématu Čistý a ověřitelný kód (C++/CLI).

Možnost /clr:pure compiler je v sadě Visual Studio 2015 zastaralá a v sadě Visual Studio 2017 není podporována.

Příklady

Tato ukázka kódu vygeneruje komponentu s exportovanou nativní funkcí, jejíž konvence volání je implicitně __cdecl.

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

Následující ukázka vytvoří čistého klienta, který využívá nativní funkci. Konvence volání v rámci /clr:pure je však __clrcall. Následující ukázka vygeneruje LNK2031.

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

int main() {
   return func();
}

Následující ukázka ukazuje, jak využívat nativní funkci z čisté image. Všimněte si specifikátoru explicitní __cdecl konvence volání.

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

int main() {
   return func();
}