사전 컴파일 된 헤더와 LNK2019 오류를 링크하는 Visual C ++
-
12-09-2019 - |
문제
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();
...
};
제휴하지 않습니다 StackOverflow