2009-06-07 12 views
0

Ich hatte ein sehr seltsames Problem mit Precompile-Header. Der Linker generiert LNK2019: nicht aufgelöster externer Symbolfehler, wenn ich Methode in CPP-Datei implementiere. Das Programm könnte jedoch kompiliert werden, wenn ich die Methode in der .h-Datei implementiere. Ich habe zufällig eine Lösung gefunden, aber ich habe keine Ahnung von der Ursache dieses Fehlers.Visual C++ Linking LNK2019 Fehler mit einem vorkompilierten Header

Meine Projektstruktur sieht wie folgt aus

Lösung
-> Projekt 1
-> Projekt 2

Projekt 1 hat 3 Dateien. A.h, A.cpp und stdafx.h

In Projekt 2. Ich möchte A-Klasse verwenden.

Datei whatever.cpp

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

In der Kompilierung, der Linker Berichte nicht aufgelöste externe Symbol Fehler für die A Konstruktion Funktion. Wenn ich den Konstruktor in der A.h-Datei implementiere. Das Projekt2 konnte erfolgreich durchgeführt werden. Ich möchte wissen, warum kann die Implementierung nicht in A.cpp Datei setzen? Was ist der richtige Weg, um Vorkopie-Header zu organisieren?

Danke

Antwort

1

Projekt 2 nicht der Definition des A-Konstruktor enthalten - eine Möglichkeit, es zu geben Sichtbarkeit dieser die Definition in der Header-Datei enthalten ist (was Sie getan haben).

Ein andere Möglichkeit wäre es, die A.cpp Datei in Projekt 2.

Ein dritte Weg, um die A-Klasse oder das A-Konstruktor mit einer DEF-Datei oder über die dllexport Richtlinie zu exportieren wäre aufzunehmen.

dieses in der vorkompilierte Header-Datei:

// 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 

Dann die A-Klasse in der A-Header deklarieren:

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

Oder:

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

Danke, Der zweite Ansatz funktioniert gut für mich – LNK2019