카테고리 보관물: C++

C++

객체 파일에서 해석되지 않은 외부 심볼 Studio에서 코딩하는

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



답변

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

예:

// 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 */ }


답변

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

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

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


답변

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

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

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

답변

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

#ifdef __cplusplus
extern "C"
{
#endif

그리고 이것들은 결국

#ifdef __cplusplus
}
#endif


답변

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

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


답변

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

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

#include WtsApi32.h

필요합니다 :

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


답변

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