Поделиться через


Ошибка средств компоновщика LNK2022

Сбой операции метаданных (HRESULT): error_message

Компоновщик обнаружил ошибку при слиянии метаданных. Ошибки метаданных должны быть разрешены для успешной связи.

Одним из способов диагностики этой проблемы является запуск маркеров ildasm в файлах объектов, чтобы найти, какие типы имеют маркеры, перечисленные в error_message, и искать различия. В метаданных два разных типа с одинаковым именем недопустимы, даже если только атрибут LayoutType отличается.

Одна из причин LNK2022 заключается в том, что тип (например, структура) существует в нескольких компиляторах с одинаковым именем, но с конфликтующими определениями и при компиляции с / clr. В этом случае убедитесь, что тип имеет одинаковое определение во всех компиляторах. Имя типа указано в error_message.

Еще одна возможная причина LNK2022 заключается в том, что компоновщик находит файл метаданных в другом расположении, отличном от указанного компилятору (с #using ). Убедитесь, что файл метаданных (.dll или .netmodule) находится в том же расположении, что и при передаче компоновщику, так как он был передан компилятору.

При создании приложения ATL необходимо использовать макрос _ATL_MIXED во всех компиляторах, если он используется по крайней мере в одном.

Примеры

В следующем примере определяется пустой тип.

// LNK2022_a.cpp
// compile with: /clr /c
public ref class Test {};

В этом примере показано, что невозможно связать два файла исходного кода, содержащие типы одного и того же имени, но разные определения.

Следующий пример создает LNK2022.

// LNK2022_b.cpp
// compile with: LNK2022_a.cpp /clr /LD
// LNK2022 expected
public ref class Test {
   void func() {}
   int var;
};