静态链接的非托管库和C ++ CLR

时间:2009-05-15 18:19:29

标签: c++ clr

是否可以使用在C ++ CLR中使用/ MT编译的库?它抛出了大量的LNK2022“元数据操作失败(8013118D)”错误(如果我在CLR项目中使用/ MD)或“'/ MT'和'/ clr:pure'命令行选项是不兼容的”如果我使用/ MT。

我需要在库中更改什么?该库是我的,但它包含几个第三方静态库。

2 个答案:

答案 0 :(得分:3)

LNK2022很难确定。它通常意味着影响结构布局的模块配置之一与其他模块不同。

检查以下常见原因:

  • 确保所有项目都使用相同的运行时库(/ MDd或/ MD)进行当前的解决方案配置。如果一个项目正在使用Debug而其他项目正在使用Release,反之亦然,则会出现LNK2022错误。
  • 确保所有项目都使用相同的结构成员对齐方式。如果一个项目正在使用/ Zp开关,请特别注意。另外,请确保您不要有条件地使用#pragma pack(n)。

您可以使用/ d1reportSingleClassLayout_your-class-name_(不含空格)来获取有关有问题的类布局的信息。

有关详细信息,请参阅:Diagnosing Hidden ODR Violations in Visual C++

答案 1 :(得分:1)

我发现混合使用不同crt运行时版本编译的本机代码静态库的唯一方法是编写一个类似于库之间桥梁的DLL。 例如:

your.exe - 使用/ MD和clr编译 yourbridge.dll - 本机,使用/ MT编译,包括使用/ MT构建的所有第三方库。