链接器工具错误 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();
}