링커 도구 오류 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을 사용하여 링크하기만 하면 됩니다.