Errore di Visual C ++ collegamento LNK2019 con un'intestazione precompilata
-
12-09-2019 - |
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
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();
...
};