문제상황:
다음과 같은 C++ 코드를 작성하고 컴파일을 실행했을 때, unresolved external symbol 에러가 발생했습니다.
#include <iostream>
class MyClass {
public:
void printMessage();
};
int main() {
MyClass obj;
obj.printMessage();
return 0;
}
에러로그 내용:
error LNK2019: unresolved external symbol "public: void __cdecl MyClass::printMessage(void)" (?printMessage@MyClass@@QEAAXXZ) referenced in function main
해결방법:
해결된 코드와 수정된 부분에 대한 주석을 보여드리겠습니다.
#include <iostream>
class MyClass {
public:
void printMessage(); // 함수 선언
};
// 함수 정의 추가
void MyClass::printMessage() {
std::cout << "Hello, World!" << std::endl;
}
int main() {
MyClass obj;
obj.printMessage();
return 0;
}
원인분석:
에러 발생 원인은 MyClass 클래스의 printMessage 함수가 선언되었지만 정의되지 않았기 때문입니다. 클래스에서 멤버 함수를 선언할 때, 해당 함수의 정의도 함께 제공해야 합니다. 그렇지 않으면 컴파일러는 함수의 구현을 찾지 못해 "unresolved external symbol" 에러가 발생합니다. 이 문제를 해결하려면 선언한 함수에 대해 명확한 정의를 제공해야 합니다.
C++에서 클래스의 멤버 함수를 정의하는 방법은 두 가지입니다. 첫 번째 방법은 클래스 정의 내에서 인라인 함수로 정의하는 것입니다. 두 번째 방법은 클래스 외부에서 스코프 지정 연산자 ::를 사용하여 정의하는 것입니다. 본 예제에서는 두 번째 방법을 사용하여 에러를 해결했습니다.
참고링크:
Unresolved External Symbol - Microsoft Docs
[Linker Tools Error LNK2019
All about the Microsoft Visual Studio Linker error LNK2019 and how to diagnose and correct it in C and C++ code.
learn.microsoft.com](https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2019?view=msvc-160)