Ошибка средств компоновщика 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;
};