2009-07-07 10 views
1

J'utilise MSVC++ 6 pour créer un très gros projet. Certains des fichiers source de ce projet sont partagés avec un petit utilitaire que nous utilisons pour gérer l'application. Auparavant, ce petit utilitaire nécessitait une liaison avec de nombreuses bibliothèques de l'application principale et nécessitait également les DLL de l'application principale lors de l'exécution. J'ai été chargé de supprimer ces dépendances, ce qui semblait assez simple ... malheureusement, les en-têtes précompilés utilisés dans l'application principale me causent beaucoup de problèmes. J'ai d'abord retravaillé tous les fichiers de l'utilitaire pour inclure explicitement tout ce dont ils avaient besoin, puis j'ai supprimé les directives #include pour PCH (cela a supprimé 95% des dépendances inutiles pour l'utilitaire). Cela fonctionne très bien pour compiler l'utilitaire. Maintenant, cependant, la compilation de l'application principale me donne des erreurs sur les directives d'en-tête précompilées manquantes. J'ai pensé "super, je vais juste inclure le PCH sous condition". Cela ne semble pas fonctionner ... J'ai "inattendu #endif", comme mentionné here. Ma prochaine pensée a été de désactiver PCH dans l'application principale pour les trois fichiers source qui sont partagés entre l'utilitaire et l'application principale. Cela compile avec succès, mais je reçois un tas d'erreurs qui ressemblent à ceci pendant la liaison:La restructuration des dépendances de certains fichiers dans un projet utilisant des en-têtes précompilés provoque des erreurs de liens

tls7d.lib(tls707d.dll) : error LNK2005: "public: unsigned int __thiscall RWCString::length(void)const " ([email protected]@@QBEIXZ) already defined in stripledescypher.obj 

AFAICT, tous les symboles définis se multiplient sont ceux que j'inclure explicitement dans les fichiers partagés pour éviter la nécessité de PCH . Mon intuition est que puisque je relie ces 3 fichiers dans la même DLL que le fichier PCH .cpp, ils sont compilés à plusieurs endroits. Y at-il un moyen de sortir de ce gâchis? Je vais essayer à peu près n'importe quoi ...

Répondre

1

Lorsque le compilateur trouve une définition d'un symbole X lors du traitement d'une unité de compilation, il va créer un indice pour l'éditeur de liens: X est ici!

La compilation de deux fichiers source, à la fois #include ing un en-tête avec une définition (à savoir pas une simple déclaration) se traduira par deux fichiers d'objets définissant le même symbole. L'éditeur de liens trouvera un symbole défini plusieurs fois.

Il semble donc que votre fichier objet stripledescypher inclut une définition de la méthode WCString::lenght()const. Cela peut être dû au fait que le corps de la fonction est défini dans l'en-tête de la classe ou quelque chose de similaire.

Questions connexes