객체 파일에서 해석되지 않은 외부 심볼


180

Visual Studio에서 코딩하는 동안 해결되지 않은 외부 기호 오류가 발생하여 어떻게해야할지 모르겠습니다. 무엇이 잘못되었는지 모르겠습니다. 저를 해독 해 주시겠습니까? 어떤 종류의 오류를 어디에서 찾아야합니까?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

26
해결되지 않은 기호는 사용자가 어딘가에 선언했지만 정의하지 않은 기호입니다. 일반적으로 타사 라이브러리의 헤더 파일을 #include 포함했지만 라이브러리에 해당하는 .obj 파일을 찾을 위치를 링커에게 알려주지 않았습니다.
— deong

7
예쁜 일반적인 실수는 독립형으로 함수를 정의하고있는 클래스 선택기를 잊지이다 의 .cpp : 파일 당신이 (잘못을) 수행 void myFunc() { /* do stuff */ } 하는 대신에이 (오른쪽) : void A::myFunc() { /* do stuff */ }
— jave.web

.cpp 파일에서 다음과 같이 더 많이 정의하지 않으려는 경우 헤더 파일에 직접 대괄호를 추가 할 수도 있습니다 void myFunc() {};.
— Patapoom

답변:


303

이 오류는 종종 일부 함수에 선언이 있지만 정의가 없음을 의미합니다.

예:

// A.hpp
class A
{
public:
  void myFunc(); // Function declaration
};

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}

귀하의 경우, 정의를 찾을 수 없습니다. 문제는 일부 함수 선언을 가져 오는 헤더 파일을 포함하고 있지만 다음 중 하나 일 수 있습니다.

  1. cpp 파일에 함수를 정의하지 마십시오 (이 코드를 직접 작성한 경우)
  2. 정의가 포함 된 lib / dll 파일을 포함하지 마십시오

일반적인 실수는 함수를 독립형으로 정의하고 예를 들어 .cpp 파일 A::에서 클래스 선택기를 잊어 버리는 것입니다 .

틀린 : void myFunc() { /* do stuff */ }
맞다 : void A::myFunc() { /* do stuff */ }


2
프로젝트에 해당 lib 파일을 포함시키는 방법은 무엇입니까?
— tmj

@tMJ 사용중인 환경에 따라 다릅니다. 온라인 또는이 사이트에서 자습서를 찾아 보았습니다.
— Chris Morris

@ChrisMorris 함수 나 다른 것을 제대로 연결하지 않았기 때문에 함수의 정의를 사용할 수 없었습니다. 그러나 dll이 메모리에없고 LoadLibrary 호출을 통해로드되어야했기 때문입니다. (FTR)
— tmj

2
마지막 조언은 바로 여기서 문제였습니다. void myFunc() {}대신에 하고있었습니다 A::void myFunc() {}.
— 찰스

훌륭한 답변. 실제로 다른 곳에서 메소드를 복사 한 후 (1)과 A :: 부분을 모두 잊어 버렸습니다.
— RoG

24

참조하는 솔루션 내에 모든 소스 파일이 포함되어 있는지 확인하십시오.

클래스의 소스 파일 (및 구현)을 포함하지 않는 경우 Field프로젝트에 시키지 않으면 빌드되지 않으며 컴파일 중에 링크 할 수 없습니다.

또는 정적 또는 동적 라이브러리를 사용 중이고 링커에 .libs 에 대해 알려주는 것을 잊었 습니까?


3
올바른 lib 파일을 참조하면 문제가 해결되었습니다. Project-> Properties-> Linker-> General-> Additional Library Directories and Project-> Properties-> Linker-> Input-> Additional Dependencies를 사용하여 lib 디렉토리와 lib 파일을 참조하십시오
— zak

11

라이브러리가 없거나 포함 된 것으로 보이면 getName, getType 등 ...이있는 라이브러리 클래스를 파악하고 헤더 파일에 넣거나 사용할 수 #include있습니다.

또한 외부 라이브러리에서 발생하는 경우 프로젝트 파일에서 해당 라이브러리를 참조하십시오. 예를 들어,이 클래스가 abc.lib에 속하는 경우 Visual Studio에서

  1. 프로젝트 속성을 클릭하십시오.
  2. 구성 특성, C / C ++, 생성으로 이동하여 추가 포함 디렉토리 아래에서 abc.lib 위치를 가리키는 지 확인하십시오. 링커, 입력에서 추가 종속성 아래에 abc.lib가 있는지 확인하십시오.

9

방금 .cpp 파일의 main에서 함수를 호출 할 수없는 문제를 보았습니다 .h 파일에 올바르게 선언되고 .c 파일에 정의되어 있습니다. 링커 오류가 발생했습니다. 한편 일반적인 .c 파일에서 함수를 호출 할 수 있습니다. 아마도 그것은 전화 컨벤션에 달려 있습니다. 해결책은 모든 .h 파일에 다음과 같은 preproc 행을 추가하는 것이 었습니다.

#ifdef __cplusplus
extern "C"
{
#endif

그리고 이것들은 결국

#ifdef __cplusplus
}
#endif

7

내 프로젝트가 x64 프로젝트 로 컴파일 된 곳에서 오류가 발생 했습니다. x86 으로 컴파일 된 라이브러리 를 사용했습니다 .

라이브러리를 x64로 다시 컴파일하여 해결했습니다.


5

때로는 새로운 헤더 파일이 추가되고 그로 인해이 오류가 발생하기 시작하면 라이브러리를 추가하고 제거해야합니다 unresolved external symbol.

예를 들면 다음과 같습니다.

#include WtsApi32.h

필요합니다 :

#pragma comment(lib, "Wtsapi32.lib") 

4

동일한 링크 오류가 있었지만 다른 dll을 참조하는 테스트 프로젝트에서 발생했습니다. _declspec(dllexport)오류 메시지에 지정된 각 함수 앞에 추가 한 후 링크가 제대로 작동한다는 것을 알았습니다.


3

나는 원인과 구제에 관한 대부분의 요점들이이 글의 모든 기고자들에 의해 다루어 졌다고 생각합니다. 나는 '해결되지 않은 외부'문제를 지적하고 싶습니다. 예상과 다르게 대체되는 매크로로 정의 된 데이터 유형으로 인해 문제의 함수에 잘못된 유형이 제공되고 유형이있는 함수 이후 정의되지 않았으므로 해결할 수 없습니다. 특히 C / C ++-> Language에는 'No (/ Zc : wchar_t-)'로 정의되었지만 '내가하지 않은'Treat WChar_t As Builtin Type이라는 속성이 있습니다.


고마워, 이것은 내 설정 ( 'No (/ Zc : wchar_t-)')에서 문제를 일으킨다
— Noypi Gilas

2

위의 Chris Morris의 탁월한 대답 외에도 순수하게 설정되지 않았지만 자체 구현이 아닌 가상 메소드를 호출하는 경우 이와 동일한 결함을 수신 할 수있는 매우 흥미로운 방법을 찾았습니다. 똑같은 이유 (컴파일러가 메소드의 구현을 찾을 수 없으므로 사기꾼)는 내 IDE 가이 비트를 최소한의 비트로 포착하지 못했습니다.

예를 들어 다음 코드는 동일한 오류 메시지와 함께 컴파일 오류가 발생합니다.

//code testing an interface
class test
{
   void myFunc(); 
}

//define an interface
class IamInterface
{
    virtual void myFunc();
}

//implementation of the interface
class IamConcreteImpl
{
    void myFunc()
    {
       1+1=2;
    }
}

그러나 IamInterface myFunc ()를 순수한 가상 메소드 ( "구현되어야하는 메소드,"할 수있는 "메소드 인 가상 메소드보다 구현해야하는 메소드)로 변경하면 컴파일 오류가 제거됩니다.

//define an interface
class IamInterface
{
    virtual void myFunc() = 0;
}

이것이 다음 StackOverFlow 사람이 코드를 단계별로 실행하는 데 도움이되기를 바랍니다.



2

헤더 파일을 장식하십시오

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

그렇지 않으면 나쁜 일 (이 포함)이 발생할 수 있습니다


8
어때요 #pragma once?
— Allen Linatoc

2

또 다른 가능한 문제 (나는 방금 머리를 긁적이었다) :

함수를로 정의하면 inline물론 함수 는 cpp가 아닌 헤더 (또는 인라인 파일)에 정의되어야합니다 . 필자의 경우 인라인 파일에 있었지만 플랫폼 전용 구현이기 때문에 cpp 가 헤더 대신 해당 inl 파일을 포함했습니다 ... 그래, 안돼

나는 이것을 여기에 남겨 둘 것이라고 생각했다. 아마도 다른 누군가가 같은 문제를 겪고 여기서 발견했다.


1
이 의견을 공개 한 사람에게 : 답변이 잘못되었거나 도움이되지 않는다고 생각하는 이유 를 적어도 의견을 남겨 주십시오. 의견이없는 공감대는 무가치합니다.
— Johann Studanski 2016

1

나는 이것으로 어려움을 겪었다. 모든 것이 논리적으로 설정되었습니다. 생성자를 선언했지만 정의하지 않았습니다.

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}

너무 기초적인 것을 잊었을 때 키보드에서 머리를 거의 두 드렸습니다.


1

나는 오랫동안 C ++을 처음으로하고 있는데, 함수 정의에 ClassName :: 접두어를 추가하는 것을 잊었을 때이 오류가 발생합니다. 이는 C ++에 약간 독특하기 때문입니다. 그러니 이것도 확인하십시오!


1

이 링커 오류의 가능한 원인 중 하나 inline는 선언되었지만 다른 곳에 포함 된 헤더 파일에 정의되지 않은 함수일 수 있습니다 . 인라인 함수는 사용되는 모든 변환 단위에서 정의해야합니다.


0

포인터

이 문제가 있었고 포인터를 사용하여 해결했습니다. 나는 이것이 당신의 문제가 아니라는 것을 알지만, 한 시간 전에 이것을 보았을 때 여기에 있었기를 바랍니다. 내 문제는 정적 멤버 변수를 정의하지 않고 선언하고 (정의는 다른 설정을 수행하는 데 필요한 정의) 물론 포인터에는 정의가 필요하지 않습니다. 똑같이 기본적인 실수 : P


3
여기에 예가 매우 유용합니다.
— moffeltje

0

내 문제는 sconscript에 cpp파일이 정의되어 있지 않다는 것입니다. Visual Studio에는 cpp프로젝트에 파일이 있지만 다른 것이 완전히 구축되어 있기 때문에 이것은 매우 혼란 스러울 수 있습니다 .


0

내 문제는 : ctor가 "unresolved external"인 클래스의 선언 을 전달 해야했습니다 .

오류가 발생한 파일에서 다음과 같이 입력해야했습니다.

#include "ClassB" 

class ClassB; // this solved the problem

class ClassA{
    void foo(){
        ClassB* tmp = new ClassB();
        // ...
    }
};

물론, 내 프로젝트는 훨씬 더 복잡하며 이것은 단지 스 니펫 예제입니다. 또한 네임 스페이스를 사용할 때도 네임 스페이스를 선언하십시오 .


0

문제가 내 주 파일의 확장자가 .c아닌 확장 파일이라는 것을 알기 위해 몇 시간을 보냈습니다..cpp

:/


0

또 다른 가능성은 이번에는 제 문제였습니다.

라이브러리에 함수를 추가하고 라이브러리의 출력 폴더를 검색 경로에 포함 시켰습니다.

그러나 이전에 나열된 이전 버전의 라이브러리가있는 폴더가 있었으므로 VS는 이전 라이브러리를 사용하고 물론 새로운 기능을 찾지 못했습니다.


0

삽입 또는 추출 연산자를 인라인 함수로 과부하하지 않도록하십시오. 이 문제가 발생하여 해당 키워드를 삭제했을 때만 사라졌습니다.


0

내 경우에 그것을 일으킨 원인 :

Foo.cppFoo.h가없는 거대한 파일 이있었습니다. Foo.cpp이렇게 시작했다 :

// ... 100 LOC here ...
namespace NS {
// ... 100 more LOC here ...
static int var;

"static"키워드를 제거하고 다음과 같이 추가했습니다 Foo.h.

extern int var;

실수가 보입니까?

네임 스페이스 선언이 다른 코드에 묻혀 있기 때문에 var가 원래 네임 스페이스에 정의되어 있다는 것을 완전히 놓쳤습니다. 수정은 다음과 같이 extern을 변경하는 것입니다.

namespace NS {
     extern int var;
}

0

"해결되지 않은 외부 기호"오류의 원인은 함수 호출 규칙 일 수 있습니다.

모든 소스 파일이 동일한 표준 (.c 또는 .cpp)을 사용하는지 확인하거나 호출 규칙을 지정하십시오.

그렇지 않으면, 한 파일이 C 파일 (source.c)이고 다른 파일이 .cpp 파일이고 동일한 헤더에 링크 된 경우, 함수가 먼저 다음과 같이 정의되기 때문에 "해결되지 않은 외부 기호"오류가 발생합니다. C cdecl 함수이지만 동일한 헤더를 사용하는 C ++ 파일은 C ++ 함수를 찾습니다.

"해결되지 않은 외부 기호 오류"를 피하려면 함수 호출 규칙이이를 사용하는 파일간에 동일하게 유지되어야합니다.


0

링커 오류 앞의 줄을 자세히 살펴보기 전에 가능한 설명을 찾기 위해 여기에 왔습니다. 전역 선언이 누락 된 추가 실행 파일 인 것으로 나타났습니다!


0

난 그냥 같은 오류를 했어 내가 대체하여 그것을 방지하기 위해 관리 ;와 {}헤더 파일입니다.

#ifndef XYZ_h
#define XYZ_h
class XYZ
{
    public:
    void xyzMethod(){}
}
#endif

그 당시에는 void xyzMethod();컴파일하고 싶지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.