Erreur LNK2019 sous Visual Studio 2010

J’ai créé un exemple de projet c ++ sous Visual Studio 2010 avec les fichiers suivants.

Ah

#ifndef A_H #define A_H #include  void foo(); #endif 

A.cpp

 #include "Ah" void foo() { int a = 1; } 

main.cpp

 #include "Ah" int main(int argc, char* argv[]) { foo(); return 0; } 

Je reçois la sortie suivante après la construction:

1> —— Construction démarrée: Projet: opengl_test, Configuration: Debug Win32 ——

1> main.cpp

1> Ah

1> A.cpp

1> Générer du code …

1> Debug \ A.obj: avertissement LNK4042: object spécifié plusieurs fois; extras ignorés

1> main.obj: erreur LNK2019: symbole externe non résolu “void __cdecl foo (void)” (? Foo @@ YAXXZ) référencé dans la fonction _main

1> C: \ Utilisateurs \ alp \ Projets \ Exemples de test \ opengl_test \ Debug \ opengl_test.exe: erreur irrécupérable LNK1120: 1 externes non résolus

========== Build: 0 a réussi, 1 a échoué, 0 à jour, 0 ignoré ==========

Quelle est la raison de cette erreur?

Je pense que ce qui est arrivé est que Ah faisait partie du groupe Source du projet plutôt que du groupe Header, il a donc été compilé comme s’il s’agissait d’un fichier .cpp. Comme A.cpp et Ah vont générer un fichier object A.obj , le dernier à comstackr est le seul à avoir été lié. Je crois que le dernier compilé était Ah , qui n’avait pas d’implémentation de foo() , donc l’éditeur de liens n’a pas pu le trouver.

EDIT: Peu importe la réponse originale (ci-dessous), je crois que ce que vous cherchez peut-être ici: l’étrange “warning LNK4042” de Visual Studio 2010

Réponse originale (pas le problème, mais peut-être un conseil judicieux?): Votre en-tête devrait être entouré de gardes, sinon il sera défini à chaque appel et entraînera des redéfinitions.

 #ifndef A_H #define A_H #include  void foo(); #endif //A_H 

Tout d’abord, vous devez inclure “stdafx.h” dans votre fichier “a.cpp” avant la ligne d’inclusion de “ah”.

Deuxièmement, il vaut mieux append “ah” dans votre projet “Fichiers d’en-tête” et append “a.cpp” dans vos “Fichiers source”.

Ensuite, il sera compilé sans erreur! Bonne chance.

En passant, la raison d’inclure “stdafx.h” est que, par défaut, le projet utilise des en-têtes précompilés, c’est pourquoi le compilateur recherche “stdafx.h”.

Si vous le souhaitez, vous pouvez désactiver “l’en-tête précompilé”, vous n’avez pas besoin de “stdafx.h” et tout ira bien.

Le code fonctionne lorsque j’ai créé un nouveau projet. Je ne suis pas sûr, mais la cause de l’erreur peut être que j’ai ajouté le dossier “C: \ Program Files \ Microsoft SDK \ Windows \ v7.1 \ Include” aux répertoires inclus dans les parameters du projet et que Visual Studio en faisait déjà partie “C: \ Program Files (x86) \ SDK Microsoft \ Windows \ v7.0A \ Include” (pour les programmes 32 bits) par défaut. Donc, il pourrait y avoir un conflit à cause de cela. J’ai ajouté les fichiers d’en-tête opengl uniquement au dossier d’inclusion de Program Files (x86), j’ai supprimé l’inclusion du dossier Program Files de 64 bits et le code opengl semble fonctionner maintenant.