2009-06-07 102 views
0

我有一個非常奇怪的預編譯頭問題。當我在.cpp文件中實現方法時,鏈接器生成LNK2019:無法解析的外部符號錯誤。但是,如果我在.h文件中實現方法,則可以編譯該程序。我碰巧找到了一個解決方案,但我不知道這個錯誤的根本原因。Visual C++鏈接預編譯頭LNK2019錯誤

我的項目結構看起來像這樣

解決方案
- >項目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.我想使用A類。

文件whatever.cpp

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

在編譯時,爲A建築功能鏈接報告解析的外部符號錯誤。如果我在A.h文件中實現構造函數。項目2可以順利完成。我想知道,爲什麼不能把實現放在A.cpp文件中?什麼是組織預先編譯頭的正確方法?

謝謝

回答

1

項目2不包括構造函數的定義 - 給它的知名度單向的,這是包括在頭文件中的定義(你沒有)。

另一種方式將包括在項目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(); 
    ... 
}; 
+0

謝謝你,第二個方法對我很好 – LNK2019 2009-06-08 02:48:41