Erro Visual C ++ Linking LNK2019 com um cabeçalho pré-compilado
-
12-09-2019 - |
Pergunta
Eu tive um problema muito estranho com cabeçalho pré-compilação. O vinculador gera LNK2019: não resolvidos erro de símbolo externo quando eu implementar o método no arquivo .cpp. No entanto, o programa pode ser compilado se eu implementar o método em .h arquivo. Aconteceu de eu encontrar uma solução, mas eu não tenho nenhuma idéia sobre a causa raiz desse erro.
As minhas estrutura do projeto se parece com isso
Solução
-> projeto 1 |
-> projeto 2
Project 1 tem 3 arquivos. 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"
...
Em projecto 2. Eu quero usar uma classe.
arquivo whatever.cpp
#include "stdafx.h"
#include "../Project1/A.h"
...
A* a_obj = new A();
...
Em tempo de compilação, o vinculador relata não resolvida erro de símbolo externo para a função Uma construção. Se eu implementar o construtor no arquivo A.H.. o project2 poderia ser cumprida com sucesso. Eu quero saber, porque não pode colocar a implementação no arquivo a.cpp? O que é a maneira correta de organizar cabeçalho pré-compilação?
Obrigado
Solução
Projeto 2 não inclui a definição da Um construtor - uma maneira de dar-lhe visibilidade deste é incluir a definição no arquivo de cabeçalho (que você fez)
.Outra forma seria a de incluir o arquivo a.cpp no ??projeto 2.
Uma terceira forma seria a de exportar a classe A, ou o construtor Um usando um arquivo .def ou usando a diretiva dllexport
.
Coloque isso no arquivo de cabeçalho pré-compilados:
// 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
Em seguida, declarar a classe A no cabeçalho A:
DLLEXP class A
{
public:
A();
...
};
Ou:
class A
{
public:
DLLEXP A();
...
};