Question

J'ai eu un problème très étrange avec en-tête precompile. L'éditeur de liens génère LNK2019: erreur de symbole externe non résolu lorsque je mets en œuvre la méthode dans le fichier .cpp. Cependant, pourrait être compilé le programme si je mets en œuvre la méthode dans le fichier .h. Je est arrivé à trouver une solution mais je n'ai aucune idée sur la cause de cette erreur.

Ma structure de projet ressemble à ceci

Solution
-> Projet 1
-> projet 2

Projet 1 a 3 fichiers. A.h, A.cpp et 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"
...

Dans projet 2. Je veux utiliser une classe.

whatever.cpp de fichier

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

Dans la compilation, l'éditeur de liens signale l'erreur de symbole externe non résolu pour la Fonction de construction. Si je le constructeur dans implémenter fichier A.h. projet2 pourrait réussir respecté. Je veux savoir, pourquoi ne peut pas mettre la mise en œuvre dans le fichier A.cpp? Quelle est la bonne façon d'organiser en-tête precompile?

Merci

Était-ce utile?

La solution

Projet 2 ne comprend pas la définition du constructeur A - une façon de donner une visibilité de cela est d'inclure la définition dans le fichier d'en-tête (que vous avez fait)

.

Une autre façon serait d'inclure le fichier A.cpp dans le projet 2.

Une troisième voie serait d'exporter la classe A, ou Un constructeur en utilisant un fichier .def ou en utilisant la directive dllexport.

Mettre cela dans le fichier d'en-tête précompilé:

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

déclarer ensuite la classe A dans l'en-tête A:

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

Ou:

class A
{
  public:
    DLLEXP A();
   ...
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top