2009-06-07 12 views
0

ヘッダーのプリコンパイルに非常に奇妙な問題がありました。リンカーは、.cppファイル内にメソッドを実装すると、未解決の外部シンボルエラーであるLNK2019を生成します。ただし、メソッドを.hファイルに実装すると、プログラムをコンパイルすることができます。私は解決策を見つけるために起こったが、私はこのエラーの根本的な原因について全く知らない。 >プロジェクト1
- - >プロジェクト2Visual C++ LNK2019のリンク先のプリコンパイル済みヘッダーのエラー

プロジェクト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ではAクラスを使いたいと思います。コンパイル時に

ファイルwhatever.cpp

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

、リンカが構築機能のための未解決の外部シンボルエラーを報告します。 A.hファイルでコンストラクタを実装する場合。プロジェクト2は順調に成功する可能性がある。私は知りたいのですが、なぜ実装をA.cppファイルに入れることができないのですか?プリコンパイルヘッダを整理する正しい方法は何ですか?

ありがとう

答えて

1

プロジェクト2は、コンストラクタの定義が含まれていません - それをこのの可視性を与えるための一つの方法は、(あなたがやった)ヘッダファイルに定義を含めることです。

もう一つの方法は、プロジェクト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 

を次にヘッダ内のクラスを宣言:

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

または:

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

は、第二のアプローチをありがとう私のためにうまくいく – LNK2019

関連する問題