문제

Precompile 헤더에 매우 이상한 문제가있었습니다. 링커는 .CPP 파일에서 메소드를 구현할 때 LNK2019 : 해결되지 않은 외부 심볼 오류를 생성합니다. 그러나 .h 파일에서 메소드를 구현하면 프로그램을 컴파일 할 수 있습니다. 해결책을 찾았지만이 오류의 근본 원인에 대해 전혀 모릅니다.

내 프로젝트 구조는 다음과 같습니다

해결책
-> 프로젝트 1
-> 프로젝트 2

프로젝트 1에는 3 개의 파일이 있습니다. 아, a.cpp 및 stdafx.h

file A.h
#pragma once
class A
{
public:
    int num;
    A();

};

file A.cpp
#include "stdafx.h"
    A::A()
      {
          num = 2;
      }

file stdafx.h
...
#include "A.h"
...

프로젝트 2에서는 수업을 사용하고 싶습니다.

뭐든지 제출 .cpp

#include "stdafx.h"
#include "../Project1/A.h"
...
    A* a_obj = new A();
...

컴파일 시간에 링커는 A 구조 기능에 대한 해결되지 않은 외부 기호 오류를보고합니다. AH 파일에서 생성자를 구현하는 경우. Project2는 성공적으로 준수 할 수 있습니다. 알고 싶습니다. 왜 구현을 A.CPP 파일로 넣을 수 없습니까? Precompile 헤더를 구성하는 올바른 방법은 무엇입니까?

고맙습니다

도움이 되었습니까?

해결책

프로젝트 2에는 A 생성자의 정의가 포함되어 있지 않습니다.이를 가시적으로 제공하는 한 가지 방법은 헤더 파일에 정의를 포함시키는 것입니다.

또 다른 방법은 프로젝트 2에 A.CPP 파일을 포함시키는 것입니다.

세 번째 방법은 A 클래스 또는 .def 파일을 사용하거나 사용하는 생성자를 내보내는 것입니다. dllexport 지령.

이것을 사전 컴파일 된 헤더 파일에 넣으십시오.

// set up export import macros for client project use
// define the symbol "PROJ1" before including this file in project 1 only
// leave it undefined for other projects
#ifdef PROJ1
#define DLLEXP __declspec(dllexport)
#else
#define DLLEXP __declspec(dllimport)
#endif

그런 다음 A 헤더에서 A 클래스를 선언합니다.

DLLEXP class A
{
  public:
    A();
   ...
};

또는:

class A
{
  public:
    DLLEXP A();
   ...
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top