Domanda

Ho avuto un problema molto strano con l'intestazione precompilare. Il linker genera LNK2019: non risolti errore di simbolo esterno quando ho implementare il metodo in file cpp. Tuttavia, il programma potrebbe essere compilato se implementare il metodo in file h. Mi è capitato di trovare una soluzione, ma non ho idea sulla causa principale di questo errore.

La mia struttura di progetto simile a questo

Soluzione
-> Progetto 1
-> Progetto 2

Progetto 1 ha 3 file. A.h, A.cpp e 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"
...

Nel progetto 2. Voglio usare una classe.

file whatever.cpp

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

In fase di compilazione, il linker segnala irrisolto errore simbolo esterno per la funzione di una costruzione. Se a implementare il costruttore nel file di A.h. il progetto2 potrebbe avere successo rispettato. Voglio sapere, perché non si può mettere l'attuazione in A.cpp il file? Qual è il modo giusto di organizzare un colpo di testa precompilare?

Grazie

È stato utile?

Soluzione

Progetto 2 non include la definizione del Un costruttore - un modo per dare visibilità di questo è quello di includere la definizione nel file di intestazione (che avete fatto)

.

Un altro modo sarebbe quello di includere il file A.cpp in Project 2.

Un terzo modo sarebbe quello di esportare la classe A, o un costruttore utilizzando un file .def o utilizzando la direttiva dllexport.

Mettere questo nel file di intestazione precompilato:

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

Poi dichiarare la classe A nell'intestazione A:

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

o

class A
{
  public:
    DLLEXP A();
   ...
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top