リンカー ツール エラー LNK2031
"function_declaration" decorated_name の p/invoke を生成できませんでした。呼び出し規則がメタデータに見つかりません
解説
ネイティブ関数を純粋なイメージにインポートしようとする場合、ネイティブと純粋コンパイルでは暗黙的な呼び出し規則が異なることに注意してください。 純粋なイメージの詳細については、「純粋なコードと検証可能なコード (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();
}