Ошибка средств компоновщика 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();
}