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


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.