2017-09-03 2 views
0
//........Project for ABC.dll 
//ABC.h 
#pragma once 
class ABC{ 
public: 
    ABC(){} 
private: 
    std::vector<int> m_vector; 
}; 

//ABC.cpp 
#include "Stdafx.h" 
#include "ABC.h" 

//Stdafx.h 
#include <vector> 

Jusqu'à aujourd'hui, j'ai sautées #include <standard-lib.h> dans mes têtes en déléguant à tête Stdafx.h.problèmes d'en-tête précompilés

Cela n'a jamais été un problème lorsque je travaillais sur un seul fichier de projet.

Maintenant j'essaye d'ajouter un nouveau projet de DLL pour rassembler des codes partagés dans un projet.

Il a bien compilé et généré ABC.dll aussi.

Voici un problème. Lorsqu'un autre projet qui utilise ABC.dll affiche une erreur de compilation indiquant que std::vector n'existe pas.

//...........Another Project using ABC.dll 
int main(){ 
    ABC abc; 
} 

Erreur « vecteur » C2039: n'est pas membre du « std »

Pour le faire fonctionner, je devais inclure toutes les bibliothèques dans Stdafx.h du consommateur trop . Peut-être que j'ai mal utilisé l'en-tête précompilé.

Je veux savoir si la façon dont j'ai fait avec le PCH était erronée ou juste.

Si ce n'est pas le cas, j'apprécierais que vous suggériez de bonnes façons d'utiliser PCH.

Merci.

+0

Le dernier extrait est manquant '#include '. Ce qui est nécessaire pour compiler ABC.h. Vous n'avez jamais réalisé cela avant, car stdafx.h l'incluait. Notez également que le #include pour le vecteur dans le premier extrait ne fait rien d'utile, il était déjà inclus. Rien de tout cela * en réalité * n'a rien à voir avec les en-têtes précompilés. –

Répondre

0

Vos problèmes n'ont rien à voir avec les en-têtes précompilés. Une bonne pratique consiste à inclure tous les éléments directement utilisés par le fichier en cours. Cela empêchera les modifications dans les inclusions d'un fichier d'en-tête de potentiellement nécessiter des modifications dans les fichiers qui utilisent cet en-tête. vector doit être inclus dans ABC.h car il y est directement utilisé. Sinon, vous finirez par avoir du mal à comprendre quels en-têtes doivent être inclus lorsque vous incluez cet en-tête de bibliothèque.

+0

Merci. Mais je me demande pourquoi MSVC n'a pas montré de message d'erreur dans le projet DLL à propos de l'inclusion manquante de 'vector.h' dans ABC.h. –

+0

@JaeJunLEE 'ABC.cpp' contient' Stdafx.h' qui inclut 'vector'. Notez que 'ABC.h' est inclus seulement après que' vector' a été inclus, donc vous avez réussi à esquiver la balle. – VTT

+0

Ok, je le comprends. Merci d'avoir répondu. –