Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ '정의되지 않은 참조/확인되지 않은 외부 기호' 오류란 무엇이며 어떻게 해결할까?

C++ '정의되지 않은 참조(undefined reference)' 오류란?

이름에서 알 수 있듯이, 이 오류는 선언만 하고 실제로 정의하지 않은 기호(함수나 변수)가 존재할 때 발생하는 링커(linker) 오류입니다. 코드는 컴파일 단계를 통과했지만, 링커가 해당 기호의 실제 구현체를 찾지 못해 최종 실행 파일을 만들지 못하는 상황이라고 이해하면 됩니다.

발생 원인은 매우 다양하지만, 가장 흔히 나타나는 세 가지 경우를 살펴보겠습니다.

1. 선언한 이름의 정의를 잊어버린 경우

예를 들어 함수를 선언해 두고 다른 곳에서 호출했지만, 정작 함수의 본문(정의)을 작성하지 않은 경우입니다.

#include<iostream>
void foo();
int main() {
    foo(); // 선언만 되고 정의되지 않음
}

2. 한정된 이름(qualified name) 없이 정의한 경우

클래스의 멤버 함수를 정의하면서 범위 지정 연산자(::)를 사용해 해당 클래스와 연결하지 않은 경우입니다. 이렇게 작성하면 컴파일러는 그 함수를 일반 전역 함수로 인식하고, 클래스의 멤버 함수는 여전히 정의되지 않은 상태로 남게 됩니다.

#include<iostream>
class A {
public:
    void foo();
};
void foo() { } // A::foo 라고 작성해야 함
int main() {
    A a;
    a.foo(); // 멤버 함수의 정의를 찾지 못함!
}

3. 종속성(라이브러리) 링크 순서가 잘못된 경우

링커는 사용자가 지정한 순서대로 객체 파일과 라이브러리를 연결합니다. 따라서 어떤 함수가 정의되어 있는 라이브러리보다 그 함수를 호출하는 객체 파일이 먼저 지정되면, 링커가 정의를 찾지 못해 이 오류가 발생할 수 있습니다.

마치며

이 오류를 유발할 수 있는 모든 조건을 빠짐없이 나열하는 것은 사실상 불가능합니다. 위의 세 가지가 가장 대표적인 원인이지만, 템플릿 관련 문제, 정적 라이브러리 누락, C/C++ 링크 방식 차이 등 다양한 변수가 존재합니다. 더 많은 원인과 해결 방법이 궁금하다면 아래 Stack Overflow 게시물을 참고해 보세요.

What is an undefined reference/unresolved external symbol error and how do I fix it? – Stack Overflow