【问题标题】:CLR/CLI linker fails with error LNK2022 - Custom attributes are not consistentCLR/CLI 链接器失败并出现错误 LNK2022 - 自定义属性不一致
【发布时间】:2013-09-05 11:08:12
【问题描述】:

环境: Visual Studio 10, CLR/CLI Class Library 项目,使用 Platform Toolset v100 构建,目标框架版本 v3.5

我知道这个问题已经在这里被问过了,但我没有找到解决我案例问题的答案,所以再次提出这个问题。

在构建 CLR/CLI Class Library (DLL) 项目时,链接器失败并出现以下错误:

MSVCMRT.lib(managdeh.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000f7).
MSVCMRT.lib(managdeh.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000fb).
MSVCMRT.lib(msilexit.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c000128).
MSVCMRT.lib(msilexit.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c00012c).
MSVCMRT.lib(puremsilcode.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000ee).
MSVCMRT.lib(puremsilcode.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0000f1).
LINK : fatal error LNK1255: link failed because of metadata errors

【问题讨论】:

标签: visual-studio-2010 c++-cli preprocessor clr


【解决方案1】:

从 C/C++ 预处理器中删除 _WIN32_WINNT=0x0500 定义

显然由于某种原因,上述预处理器定义与链接器不一致,导致链接器错误。我认为这是一些内部 Microsoft 错误(?),但不确定。 无论如何,在删除此预处理器定义后,所有构建和链接都正确。

希望这些信息有用。

【讨论】:

    【解决方案2】:

    我在此过程中学到的另一件事是您不能混合使用Platform ToolsetTarget Framework Version 的值

    我在哪里找到的可能组合:

    .NET 3.5 或更低版本:

    • Platform Toolsetv90,它将使用 Visual Studio 2008 运行时二进制文件,
    • TargetFrameworkVersionv3.5(或更低),
    • 在预处理器中,您可以定义_WIN32_WINNT(例如_WIN32_WINNT=0x0500

    .NET 4.0 或更高版本:

    • Platform Toolsetv100,它将使用 Visual Studio 2010 运行时二进制文件,
    • TargetFrameworkVersionv4.0(或更高版本),
    • 在预处理器中,您不得定义“_WIN32_WINNT=0x0500”

    如何定义这些值:

    1. Platform Toolset – 在以下位置找到它:项目设置 |一般,
    2. TargetFrameworkVersion - 卸载项目,右键单击卸载的项目并选择“编辑”。打开“*.*proj”文件后,修改以下行:<TargetFrameworkVersion>v3.5<TargetFrameworkVersion/>

    【讨论】:

    • 我想除了安装 Visual Studio 2008 来获得 Platform Toolset v90 之外,没有其他方法,不是吗?
    • 从哪里获得 Visual Studio 2008 运行时二进制文件?谷歌搜索没有帮助。
    【解决方案3】:

    我在一些设置Windows版本的编译单元中有一些头文件:

    #define _WIN32_WINNT 0x0501
    

    问题在于没有设置该变量的其他编译单元(c++ 文件),因此error LNK2022 抱怨同一结构在多个编译单元中以不同方式编译(不同的 cpp 文件)。

    所以我不能只是取消设置 _WIN32_WINNT 定义,所以我的解决方案与之前建议的完全相反。

    我只是为整个项目设置它,因此所有编译单元的编译方式相同。
    项目属性 -> C/C++ -> 预处理器 -> 预处理器定义

    _WIN32_WINNT=0x0501;
    

    【讨论】:

      猜你喜欢
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-08-29
      • 1970-01-01
      • 2020-02-09
      相关资源
      最近更新 更多