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

Foi útil?

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();
   ...
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top