Слияние 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;