링커 도구 경고 LNK4227
메타데이터 작업 경고(HRESULT) : warning_message
링커는 병합할 때 메타데이터 차이를 감지했습니다.
현재 빌드 중인 어셈블리가 있는 하나 이상의 참조된 어셈블리입니다.
컴파일에 있는 하나 이상의 소스 코드 파일입니다.
예를 들어 이름이 같지만 매개 변수 정보가 다르게 선언된 두 개의 전역 함수가 있는 경우 LNK4227 발생할 수 있습니다(즉, 선언이 모든 컴파일랜드에서 일치하지 않음). 각 .obj 파일에서 ildasm.exe /TEXT /METADATA object_file 사용하여 형식이 어떻게 다른지 확인합니다.
LNK4227 다른 도구에서 발생하는 문제를 보고하는 데도 사용됩니다. 자세한 내용은 경고 메시지를 검색합니다.
경고를 해결하려면 메타데이터 문제를 해결해야 합니다.
예제
참조된 어셈블리가 참조하는 어셈블리와 다르게 서명된 경우 LNK4227 생성됩니다.
다음 샘플에서는 LNK4227 생성합니다.
// LNK4227.cpp
// compile with: /clr
using namespace System::Reflection;
[assembly:AssemblyDelaySignAttribute(false)];
int main() {}
그런 다음
// LNK4227b.cpp
// compile with: /clr LNK4227.cpp /FeLNK4227b.exe
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
[assembly:AssemblyDelaySignAttribute(true)];
// Try the following line instead
// [assembly:AssemblyDelaySignAttribute(false)];
ref class MyClass
{
};
잘못된 형식의 버전 번호가 어셈블리 특성에 전달될 때 LNK4227 생성될 수도 있습니다. '*' 표기법은 AssemblyVersionAttribute
. 이 경고를 해결하려면 버전 특성 AssemblyVersionAttribute
에서 숫자만 사용합니다.
다음 샘플에서는 LNK4227 생성합니다.
// LNK4227e.cpp
// compile with: /clr /LD /W1
using namespace System::Reflection;
[assembly:AssemblyVersionAttribute("2.3.*")]; // OK
[assembly:AssemblyFileVersionAttribute("2.3.*")]; // LNK4227
// try the following line instead
// [assembly:AssemblyFileVersionAttribute("2.3")];