Pregunta

Yo tenía un problema muy raro con cabecera precompilación. El vinculador genera LNK2019: sin resolver error de símbolo externo cuando implemente método en el archivo .cpp. Sin embargo, el programa podría ser compilado si implemento método en el archivo .h. Me pasó a encontrar una solución, pero no tengo ni idea acerca de la causa raíz de este error.

Mi estructura del proyecto es el siguiente

Solución
-> Proyecto 1 | -> Proyecto 2

Proyecto 1 tiene 3 archivos. A.h, a.cpp y stdafx.hy

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"
...

En el proyecto 2. Quiero usar una clase.

archivo whatever.cpp

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

En tiempo de compilación, el enlazador informes sin resolver error de símbolo externo para la función de una construcción. Si implemento el constructor en el archivo A.h. el proyecto 2 podría tener éxito cumplido. Quiero saber, ¿por qué no se puede poner la aplicación en a.cpp archivo? ¿Cuál es el camino correcto para organizar cabecera precompilación?

Gracias

¿Fue útil?

Solución

Proyecto 2 no incluye la definición de la Un constructor - una manera de darle visibilidad de esto es incluir la definición en el archivo de cabecera (que lo hizo)

.

Otra forma sería la de incluir el archivo a.cpp en el proyecto 2.

Una tercera forma sería la de exportar la clase A, o la Un constructor mediante un archivo .def o el uso de la directiva dllexport.

Ponga esto en el archivo de encabezado precompilado:

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

A continuación, declarar la clase A en la cabecera A:

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

O:

class A
{
  public:
    DLLEXP A();
   ...
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top