0

プリコンパイルヘッダーに非常に奇妙な問題がありました。.cpp ファイルにメソッドを実装すると、リンカが LNK2019: unresolved external symbol エラーを生成します。ただし、メソッドを .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 では、A クラスを使用したいと考えています。

ファイルwhatever.cpp

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

コンパイル時に、リンカは A 構築関数の未解決の外部シンボル エラーを報告します。コンストラクターを Ah ファイルに実装するとします。project2 は正常に準拠できます。知りたいのですが、実装を A.cpp ファイルに入れられないのはなぜですか? プリコンパイルヘッダーを整理する正しい方法は何ですか?

ありがとうございました

4

1 に答える 1

1

プロジェクト 2 には、A コンストラクターの定義が含まれていません。これを可視化する 1 つの方法は、ヘッダー ファイルに定義を含めることです (実際に実行しました)。

もう 1 つの方法は、プロジェクト 2 に A.cpp ファイルを含めることです。

dllexport3 つ目の方法は、.def ファイルまたはディレクティブを使用して、A クラスまたは A コンストラクターをエクスポートすることです。

これをプリコンパイル済みヘッダー ファイルに入れます。

// 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();
   ...
};
于 2009-06-07T21:42:27.617 に答える