Слияние CLR/CLI с ошибкой LNK2022 - Пользовательские атрибуты несовместимы

Окружающая среда: 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

Ответ 1

Еще одна вещь, которую я узнал на этом пути, заключается в том, что вы не можете смешивать значения из Platform Toolset и Target Framework Version.

Возможные комбинации, которые я нашел где:

.NET 3.5 или меньше:

  • Platform Toolset: v90, который будет использовать Visual Studio 2008 исполняемые файлы,
  • TargetFrameworkVersion: v3.5 (или меньше),
  • В препроцессоре вы можете указать _WIN32_WINNT (например, _WIN32_WINNT=0x0500)

.NET 4.0 или выше:

  • Platform Toolset: v100, который будет использовать Visual Studio 2010 исполняемые файлы,
  • TargetFrameworkVersion: v4.0 (или выше),
  • В препроцессоре вы не должны иметь '_WIN32_WINNT = 0x0500', определенный

Как определить эти значения:

  • Platform Toolset - найти его в: Настройки проекта | Общие,
  • TargetFrameworkVersion - Выгрузите проект, щелкните правой кнопкой мыши на выгруженном проекте и выберите "Изменить". После открытия файла "*. * Proj" измените следующую строку: <TargetFrameworkVersion>v3.5<TargetFrameworkVersion/>

Ответ 2

Удалить определение _WIN32_WINNT=0x0500 из препроцессора C/С++

По-видимому, почему-то указанное определение препроцессора не согласуется с компоновщиком, вызывая ошибки компоновщика. Я предполагаю, что это некоторая внутренняя ошибка Microsoft (?), Но не уверен. В любом случае, после удаления этого определения препроцессора все правильно построены и связаны.

Надеемся, что эта информация полезна.

Ответ 3

У меня были некоторые файлы заголовков в некоторых единицах компиляции, которые устанавливали версию Windows:

#define _WIN32_WINNT 0x0501

Проблема заключалась в других единицах компиляции (С++ файлах), которые не установили эту переменную, поэтому error LNK2022 жалуется, что одна и та же структура компилируется по-разному в нескольких единицах компиляции (разные файлы cpp).

Поэтому я не могу просто отменить определение _WIN32_WINNT, поэтому мое решение было совершенно противоположным тому, что было предложено ранее.

Я просто установил его для всего проекта, поэтому все компиляции компилируются одинаково.
свойства проекта → C/С++ → Препроцессор → Определения препроцессора

_WIN32_WINNT=0x0501;