링커 도구 경고 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
하세요.