다음을 통해 공유


링커 도구 경고 LNK4221

이 개체 파일은 이전에 정의되지 않은 공용 기호를 정의하지 않으므로 이 라이브러리를 사용하는 링크 작업에서 사용되지 않습니다.

다음 두 코드 조각을 a.cpp고려합니다.

// a.cpp
#include <atlbase.h>

그리고 다음과 같이 b.cpp를 업데이트합니다.

// b.cpp
#include <atlbase.h>
int function()
{
   return 0;
}

파일을 컴파일하고 두 개의 개체 파일을 만들려면 명령 프롬프트에서 실행 cl /c a.cpp b.cpp 합니다. 개체 파일을 실행 link /lib /out:test.lib a.obj b.obj하여 연결하면 LNK4221 경고가 표시됩니다. 실행 link /lib /out:test.lib b.obj a.obj하여 개체를 연결하는 경우 경고가 표시되지 않습니다.

링커가 LIFO(마지막 선입선 실행) 방식으로 작동하므로 두 번째 시나리오에서는 경고가 발생하지 않습니다. 첫 번째 시나리오 b.obj 에서는 이전에 a.obj처리되며 a.obj 추가할 새 기호가 없습니다. 링커에 먼저 처리 a.obj 하도록 지시하면 경고를 방지할 수 있습니다.

이 오류의 일반적인 원인은 두 소스 파일이 미리 컴파일된 헤더 필드에 지정된 것과 동일한 헤더 파일 이름을 사용하여 옵션 /Yc (미리 컴파일된 헤더 파일 만들기)을 지정하는 경우입니다. 이 문제의 일반적인 원인은 pch.h 기본적으로 pch.cpp 새 기호를 포함 pch.h 하며 추가하지 않기 때문에 처리됩니다. 다른 원본 파일이 포함 pch.h/Yc 되고 연결된 .obj 파일이 이전에 pch.obj처리되는 경우 링커는 LNK4221 throw합니다.

이 오류의 일반적인 원인은 두 소스 파일이 미리 컴파일된 헤더 필드에 지정된 것과 동일한 헤더 파일 이름을 사용하여 옵션 /Yc (미리 컴파일된 헤더 파일 만들기)을 지정하는 경우입니다. 이 문제의 일반적인 원인은 stdafx.h 기본적으로 stdafx.cpp 새 기호를 포함 stdafx.h 하며 추가하지 않기 때문에 처리됩니다. 다른 원본 파일이 포함 stdafx.h/Yc 되고 연결된 .obj 파일이 이전에 stdafx.obj처리되는 경우 링커는 LNK4221 throw합니다.

이 문제를 해결하는 한 가지 방법은 미리 컴파일된 각 헤더에 대해 해당 헤더를 포함하는 원본 파일이 하나만 있는지 확인하는 것입니다 /Yc. 다른 모든 원본 파일은 미리 컴파일된 헤더를 사용해야 합니다. 이 설정을 변경하는 방법에 대한 자세한 내용은 (미리 컴파일된 헤더 파일 사용)을 참조 /Yu 하세요.