Frage

Ich hatte ein sehr sonderbares Problem mit precompile-Header. Der Linker erzeugt LNK2019: nicht aufgelöstes externes Symbol Fehler, wenn ich Methode in CPP-Datei implementieren. Allerdings könnte das Programm kompiliert werden, wenn ich Methode in .h-Datei implementieren. Ich war zufällig, um eine Lösung zu finden, aber ich habe keine Ahnung über die Ursache für diesen Fehler.

Meine Projektstruktur sieht wie folgt aus

Lösung
-> Projekt 1 | -> Projekt 2

Projekt 1 hat 3 Dateien. A. h, A.cpp und 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"
...

Im Projekt 2. Ich möchte eine Klasse verwenden.

Datei whatever.cpp

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

In der Kompilierung, meldet der Linker nicht aufgelösten externes Symbol Fehler für die A Konstruktion Funktion. Wenn ich den Konstruktor in A. h Datei implementieren. die project2 konnte erfolgreich erfüllt sein. Ich möchte wissen, warum kann die Umsetzung in A.cpp Datei setzen? Was ist der richtige Weg precompile Header zu organisieren?

Danke

War es hilfreich?

Lösung

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

.

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

Eine dritte Möglichkeit, das A-Klasse oder das A-Konstruktor mit einer DEF-Datei oder über die dllexport Richtlinie.

Für den Export wäre

Setzen Sie diese 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 den A-Header deklarieren:

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

Oder:

class A
{
  public:
    DLLEXP A();
   ...
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top