다음을 통해 공유


링커 도구 경고 LNK4049

'filename.obj'에 정의된 기호 'symbol'을 가져옵니다.

기호가 같은 이미지의 개체 파일 filename.obj 정의되어 있더라도 __declspec(dllimport)가 기호로 지정되었습니다. 이 __declspec(dllimport) 경고를 해결하려면 한정자를 제거합니다.

설명

이 경고는 한 개체 파일에서 기호를 정의하고 다른 개체 파일의 선언 한정자를 사용하여 __declspec(dllimport) 참조할 때 링커에 의해 생성됩니다.

경고 LNK4049 링커 도구 경고 LNK4217 보다 일반적인 버전입니다. 링커는 가져온 기호를 참조하는 함수 또는 개체 파일을 확인할 수 없는 경우 경고 LNK4049 생성합니다.

LNK4217 대신 LNK4049 생성되는 일반적인 경우는 다음과 같습니다.

LNK4049 해결하려면 다음 절차 중 하나를 시도합니다.

  • __declspec(dllimport) LNK4049 트리거한 기호의 정방향 선언에서 한정자를 제거합니다. DUMPBIN 유틸리티를 사용하여 이진 이미지 내에서 기호를 검색할 수 있습니다. DUMPBIN /SYMBOLS 스위치는 이미지의 COFF 기호 테이블을 표시합니다. DUMPBIN 유틸리티에 대한 자세한 내용은 DUMPBIN 참조를 참조하세요.

  • 증분 연결 및 전체 프로그램 최적화를 일시적으로 사용하지 않도록 설정합니다. 다시 컴파일되면 애플리케이션은 가져온 기호를 참조하는 함수의 이름을 포함하는 경고 LNK4217 생성합니다. __declspec(dllimport) 가져온 기호에서 선언 한정자를 제거하고 필요에 따라 증분 연결 또는 전체 프로그램 최적화를 다시 사용하도록 설정합니다.

최종 생성된 코드가 올바르게 동작하지만 가져온 함수를 호출하기 위해 생성된 코드는 함수를 직접 호출하는 것보다 효율성이 떨어집니다. 이 경고는 /clr 옵션을 사용하여 컴파일할 때 표시되지 않습니다.

데이터 선언 가져오기 및 내보내기에 대한 자세한 내용은 dllexport, dllimport를 참조하세요.

예시

다음 두 모듈을 연결하면 LNK4049 생성됩니다. 첫 번째 모듈은 내보낸 단일 함수를 포함하는 개체 파일을 생성합니다.

// LNK4049a.cpp
// compile with: /c

__declspec(dllexport) int func()
{
   return 3;
}

두 번째 모듈은 함수 내에서 main 이 함수에 대한 호출과 함께 첫 번째 모듈에서 내보낸 함수에 대한 전달 선언이 포함된 개체 파일을 생성합니다. 이 모듈을 첫 번째 모듈과 연결하면 LNK4049 생성됩니다. 선언에서 __declspec(dllimport) 한정자를 제거하여 경고를 해결합니다.

// LNK4049b.cpp
// compile with: /link /WX /LTCG LNK4049a.obj
// LNK4049 expected

__declspec(dllimport) int func();
// try the following line instead
// int func();

int main()
{
   return func();
}

참고 항목

링커 도구 경고 LNK4217
링커 도구 경고 LNK4286
dllexport, dllimport