Поделиться через


Ошибка средств компоновщика LNK2031

не удалось создать p/invoke для decorated_name "function_declaration"; отсутствие соглашения о вызове в метаданных

Замечания

При попытке импортировать собственную функцию в чистое изображение помните, что неявные соглашения о вызовах различаются между собственными и чистыми компиляциями. Дополнительные сведения о чистых изображениях см. в разделе "Чистый и проверяемый код" (C++/CLI).

Параметр компилятора /clr:pure не рекомендуется использовать в Visual Studio 2015 и не поддерживается в Visual Studio 2017.

Примеры

Этот пример кода создает компонент с экспортируемой, собственной функцией, соглашение о вызовах которой неявно __cdecl.

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

В следующем примере создается чистый клиент, который использует собственную функцию. Однако соглашение о вызове в /clr:pure __clrcall. Следующий пример создает LNK2031.

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

int main() {
   return func();
}

В следующем примере показано, как использовать собственную функцию из чистого образа. Обратите внимание на явный __cdecl описатель соглашения о вызовах.

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

int main() {
   return func();
}