プリコンパイル済みヘッダーを使用してVisual C ++リンクLNK2019エラー
-
12-09-2019 - |
質問
私は、プリコンパイルヘッダと非常に奇妙な問題を抱えていました。私は、.cppファイル内のメソッドを実装したときに未解決の外部シンボルエラー:リンカがLNK2019が生成されます。私は.hファイル内のメソッドを実装する場合は、プログラムをコンパイルすることができます。私は解決策を見つけるために起こったが、私は、このエラーの根本的な原因については考えている。
私のプロジェクトの構造は次のようになります。
ソリューション
- >プロジェクト1
- >プロジェクト2
プロジェクト1は、3つのファイルがあります。 A.h、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.で、私はクラスを使用します。
ファイルwhatever.cpp
#include "stdafx.h"
#include "../Project1/A.h"
...
A* a_obj = new A();
...
コンパイル時では、リンカーは、構築機能のための未解決の外部シンボルエラーを報告します。私はA.hファイル内のコンストラクタを実装する場合。 Project2の成功遵守することができます。私が知りたいのは、なぜA.cppファイルに実装を置くことができませんか?プリコンパイルヘッダを整理するための正しい方法は何ですか?
ありがとうございます。
解決
プロジェクト2は、Aのコンストラクタの定義が含まれていません - 。それをこのの可視性を与えるための一つの方法は、(あなたがやっている)ヘッダファイルに定義を含めることです。
もう一つの方法は、プロジェクト2にA.cppファイルを含めることであろう。
第三の方法は、クラス、または.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のヘッダ内のクラスを宣言します:
DLLEXP class A
{
public:
A();
...
};
それともます:
class A
{
public:
DLLEXP A();
...
};