다음을 통해 공유


링커 도구 오류 LNK2022

메타데이터 작업 실패(HRESULT) : error_message

링커가 메타데이터를 병합하는 동안 오류를 감지했습니다. 성공적으로 연결하려면 메타데이터 오류를 해결해야 합니다.

이 문제를 진단하는 한 가지 방법은 개체 파일에서 ildasm -token을 실행하여 토큰이 나열된 error_message형식을 찾고 차이점을 찾는 것입니다. 메타데이터에서는 just 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;
};