다음을 통해 공유


링커 도구 오류 LNK2019

업데이트: 2007년 11월

오류 메시지

'symbol' 외부 기호(참조 위치: 'function' 함수)에서 확인하지 못했습니다.
unresolved external symbol 'symbol' referenced in function 'function'

정의되지 않은 외부 기호(symbol)를 function에서 발견했습니다. 이 오류를 해결하려면 기호의 정의를 제공하거나 기호를 참조하는 코드를 제거하십시오. 자세한 내용은 다음을 참조하십시오.

다음 샘플에서는 LNK2019 오류가 생성됩니다.

// LNK2019.cpp
// LNK2019 expected
extern char B[100];   // B is not in avilable to the linker
int main() {
   B[0] = ' ';
}

LNK2019는 정적 데이터 멤버를 선언했지만 이를 정의하지 않은 경우에도 발생할 수 있습니다. 다음 샘플에서는 LNK2019 오류가 생성됩니다.

// LNK2019b.cpp
// LNK2019 expected
struct C {
   static int s;
};

// Uncomment the following line to resolve.
// int C::s;

int main() {
   C c;
   C::s = 1;
}

다음 코드를 참고하십시오.

// LNK2019c.cpp
// LNK2019 expected
extern int i;
extern void g();
void f() {
   i++;
   g();
}
int main() {}

빌드에 포함된 파일 중 하나에 i 및 g가 정의되어 있지 않으면 링커가 LNK2019를 발생시킵니다. 이러한 정의는 정의를 컴파일의 일부로 포함하는 소스 코드 파일을 포함시켜서 추가할 수 있습니다. 또는 정의를 포함하는 .obj 또는 .lib 파일을 링커에 전달할 수 있습니다.

이전 릴리스의 C++ 프로젝트에서 현재 버전으로 업그레이드한 경우 __UNICODE가 정의되어 있고 WinMain이 진입점이면 진입점 함수의 이름을 _tWinMain 또는 wWinMain으로 변경해야 합니다.

LNK2019를 발생시키는 일반적인 문제는 다음과 같습니다.

  • 기호 선언에 잘못된 철자가 있어서 기호 정의에서의 이름과 같지 않습니다.

  • 함수가 사용되었지만 매개 변수의 번호 또는 형식이 함수 정의와 일치하지 않았습니다.

  • 호출 규칙(__cdecl, __stdcall 또는 __fastcall)이 함수 선언과 함수 정의에서 다르게 사용됩니다.

  • 기호가 C 프로그램으로 컴파일된 파일에 정의되었으며 C++ 파일에서 extern "C" 한정자 없이 선언되었습니다. 이러한 경우에는 선언을 수정하십시오. 예를 들면, 다음과 같습니다.

    extern int i;
    extern void g();
    

    이 코드 대신에 다음 코드가 사용됩니다.

    extern "C" int i;
    extern "C" void g();
    

    마찬가지로 C 프로그램에서 사용될 기호를 C++ 파일에 정의하는 경우에는 정의에 extern "C"를 사용하십시오.

  • 기호가 정적으로 정의된 다음 나중에 파일 외부에서 참조되었습니다. C에서와는 달리 C++에서는 전역 상수가 static 링크를 사용합니다. 이 제한 사항을 고려하려면 헤더 파일에 const 초기화를 포함시킨 다음 해당 헤더를 .cpp 파일에 포함시키거나, 변수를 비상수로 만든 다음 상수 참조를 사용하여 액세스하면 됩니다.

  • 클래스의 정적 멤버가 정의되지 않았습니다. 예를 들어, 아래의 클래스 선언에 있는 멤버 변수 si는 별도로 정의되어야 합니다.

    // LNK2019d.cpp
    #include <stdio.h>
    struct X {
       static int si;
    };
    
    // int X::si = 0;   // uncomment this line to resolve
    
    int main() {
       X *px = new X[2];
       printf_s("\n%d",px[0].si);   // LNK2019
    }
    

다음 샘플에서는 사용자 정의 연산자에 대한 LNK2019가 생성됩니다.

// LNK2019e.cpp
// compile with: /EHsc
// LNK2019 expected
#include <iostream>
using namespace std;

template<class T> class 
Test {
   friend ostream& operator<<(ostream&, Test&);
   // Uncomment the following line to resolve.
   // template<typename T> friend ostream& operator << (ostream&, Test<T>&);
};

template<typename T>
ostream& operator<<(ostream& os, Test<T>& tt) {
   return os;
}

int main() {
   Test<int> t;
   cout << "Test: " << t << endl;   // unresolved external
}

/VERBOSE 링커 옵션을 사용하면 링커가 참조하고 있는 파일을 확인할 수 있으며, DUMPBIN 유틸리티의 /EXPORTS/SYMBOLS 옵션을 사용하면 dll 및 object/library 파일에 정의된 기호를 확인할 수 있습니다.

LNK2019에 대한 자세한 내용은 https://support.microsoft.com에서 Microsoft 기술 자료 문서를 참조하십시오.

Visual Studio .NET 2003에서는 컴파일러 규칙에 따라 템플릿 friend 및 특수화를 사용하기 때문에 LNK2019가 발생할 수도 있습니다. Visual Studio .NET 2003의 경우 함수 템플릿과 동일한 이름을 사용한 friend 함수 선언은 이 friend 선언에서 템플릿 인수를 명시적으로 지정하지 않는 한 해당 함수 템플릿을 참조하지 않습니다.

템플릿 인수를 지정하지 않으면 friend 선언에서 비템플릿 함수가 선언됩니다.

자세한 내용은 컴파일 타임의 주요 변경 내용 요약을 참조하십시오.

Visual Studio .NET 2003과 Visual Studio .NET 버전의 Visual C++ 모두에서 올바른 코드가 되도록 하려면 friend 함수의 템플릿 인수 목록을 명시적으로 지정하십시오.

// LNK2019f.cpp
// LNK2019 expected
template<class T>
void f(T) {}

template<class T>
struct S {
   friend void f(T);
   // try the folowing line instead
   // friend void f<T>(T);
};

int main() {
   S<int> s;
   f(1);   // unresolved external
}

LNK2019는 Visual C++ 2005에서 수행한 규칙 작업의 결과로 발생할 수도 있습니다. /Zc:wchar_t는 기본적으로 사용됩니다. 모든 모듈이 동일한 /Zc:wchar_t 설정으로 컴파일되지 않았을 수 있으므로 형식 참조에서 호환 형식을 확인하지 못할 수 있습니다. 이 문제를 해결하려면 Visual C++ 2005 도구 집합을 사용하여 이전 버전의 모듈과 연결할 모듈을 빌드할 때 /Zc:wchar_t-를 사용하는 경우와 같이 적절한 /Zc:wchar_t 설정을 사용하여 컴파일하거나, 가능한 경우 형식이 호환되도록 업데이트하여 모든 모듈의 형식이 호환되도록 해야 합니다.

/Zc:wchar_t가 기본적으로 사용되므로 comment pragma 또는 명령줄을 통해 comsupp.lib를 명시적으로 참조하는 경우 comsuppw.lib 또는 comsuppwd.lib를 사용하도록 변경해야 합니다. /Zc:wchar_t-를 사용하여 컴파일할 때는 comsupp.lib를 계속 사용해야 합니다.

자세한 내용은 Visual C++ 2005 컴파일러의 주요 변경 사항/Zc:wchar_t(wchar_t를 네이티브 형식으로 인식)를 참조하십시오.

다음 샘플에서는 wchar_t가 되는 WCHAR를 사용하는 내보내기를 만듭니다.

// LNK2019g.cpp
// compile with: /LD
#include "windows.h"
// WCHAR resolves to wchar_t
__declspec(dllexport) void func(WCHAR*) {}

다음 샘플에서는 LNK2019 오류가 생성됩니다.

// LNK2019h.cpp
// compile with: LNK2019g.lib
// LNK2019 expected
__declspec(dllimport) void func(unsigned short*);

int main() {
   func(0);
}

이 오류를 해결하려면 unsigned short를 wchar_t 또는 WCHAR로 변경하거나 /Zc:wchar_t-를 사용하여 LNK2019g.cpp를 컴파일해야 합니다.

/SUBSYSTEM:WINDOWS를 사용하여 콘솔 응용 프로그램을 빌드하는 경우에도 2019가 발생할 수 있습니다. 확인되지 않은 기호는 _WinMain@16이 됩니다. 이 경우 /SUBSYSTEM:CONSOLE을 사용하여 링크하기만 하면 됩니다.