CLR/CLI linker fails with error LNK2022 - Custom attributes are not consistent

后端 未结 3 1091
自闭症患者
自闭症患者 2020-12-15 22:38

Environment: Visual Studio 10, CLR/CLI Class Library project, built with Platform Toolset v100, targeting framework version

相关标签:
3条回答
  • 2020-12-15 23:07

    Remove the _WIN32_WINNT=0x0500 definition from the C/C++ Preprocessor

    Apparently for some reason the above preprocessor definition did not agree with the linker, causing the linker errors. I assume this is some internal Microsoft bug (?), but not sure. Anyway, after removing this preprocessor definition all built and linked correctly.

    Hope this information is useful.

    0 讨论(0)
  • 2020-12-15 23:15

    I had some header files in some of the compilation units that set the Windows version:

    #define _WIN32_WINNT 0x0501
    

    The problem was with the other compilation units (c++ files) that didn't set that variable, so the error LNK2022 is complaining that the same struct is compiled in different ways in multiple compilation units (different cpp files).

    So I can't just unset the _WIN32_WINNT definition, so my solution was quite the opposite of what was suggested before.

    I just set it for the whole project, so all the compilation units compile the same way.
    project properties -> C/C++ -> Preprocessor -> Preprocessor Definitions

    _WIN32_WINNT=0x0501;
    
    0 讨论(0)
  • 2020-12-15 23:20

    Another thing I learned on the way is that you cannot mix values of Platform Toolset and Target Framework Version.

    The possible combinations I found where:

    .NET 3.5 or less:

    • Platform Toolset: v90, which will use Visual Studio 2008 runtime binaries,
    • TargetFrameworkVersion: v3.5 (or less),
    • In the preprocessor you can have _WIN32_WINNT defined (e.g. _WIN32_WINNT=0x0500)

    .NET 4.0 or higher:

    • Platform Toolset: v100, which will use Visual Studio 2010 runtime binaries,
    • TargetFrameworkVersion: v4.0 (or higher),
    • In the preprocessor you must not have the '_WIN32_WINNT=0x0500' defined

    How to define these values:

    1. Platform Toolset – find it under: Project settings | General,
    2. TargetFrameworkVersion - Unload the project, right-click on the unloaded project and select 'Edit'. Once the '*.*proj' file is open, modify the following line: <TargetFrameworkVersion>v3.5<TargetFrameworkVersion/>
    0 讨论(0)
提交回复
热议问题