Je viens de me faire battre (assez durement) sur la tête par un avertissement non trivial de Visual Studio 2010 (C++).
La compilation a donné la sortie suivante :
1 Debug\is.obj : avertissement LNK4042 : objet spécifié plus d'une fois ; les extras sont ignorés
1 Debug\make.obj : avertissement LNK4042 : objet spécifié plus d'une fois ; les extras sont ignorés
1 Debug\view.obj : avertissement LNK4042 : objet spécifié plus d'une fois ; les extras sont ignorés
1 identity.obj : erreur LNK2019 : symbole externe non résoluvoid __cdecl test::identity::view(void)
(?view@identity@test@@YAXXZ) référencé dans la fonctionvoid __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)
1 identity.obj : erreur LNK2019 : symbole externe non résoluvoid __cdecl test::identity::make(void)
(?make@identity@test@@YAXXZ) référencé dans la fonctionvoid __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)
1 range.obj : erreur LNK2019 : symbole externe non résoluvoid __cdecl test::range::is(void)
(?is@range@test@@YAXXZ) référencé dans la fonctionvoid __cdecl test::range::range(void)
(?range@0test@@YAXXZ)
Les erreurs du linker sont toujours une douleur à déboguer... mais il y avait des références non résolues, alors j'ai vérifié... mais le source est bien formé... et enfin j'ai compris :
Ma hiérarchie de dossiers ressemble à ceci :
src/
identity/
is.cpp
make.cpp
view.cpp
range/
is.cpp
make.cpp
view.cpp
et c'est également la hiérarchie dans la Solution (je la configure toujours de manière à imiter la structure de dossiers "réelle").
Et les sorties de diagnostic :
Debug\is.obj
Debug\make.obj
Debug\view.obj
Avec un avertissement indiquant que le .obj
a été passé deux fois au linker et qu'un sera ignoré.
Ne cherchez pas plus loin : Visual a aplati proprement ma hiérarchie de dossiers, et donc est incapable de compiler proprement le source.
En ce moment, je pense simplement à renommer les fichiers, cela devrait résoudre le problème...
... mais y a-t-il un moyen d'empêcher Visual Studio de niveler la hiérarchie des fichiers ?
3 votes
Vient de recevoir exactement la même chose, vraiment ennuyeux que nous devions le "corriger" manuellement. Heureusement que tu as demandé avant moi. :)
0 votes
@GMan : je suis surpris que tu aies pu le trouver du tout :) As-tu cherché en utilisant Google ou le moteur de recherche SO ?
5 votes
J'ai abandonné la recherche sur SO il y a longtemps. :) Google.
40 votes
Je viens de résoudre un problème similaire dans VS 2013. Pour moi, le problème était qu'un fichier d'en-tête était compilé comme s'il s'agissait d'un fichier C++ autonome. J'ai donc fini par avoir deux fichiers objet portant le même nom : un pour foo.cpp et un pour foo.h. La solution a été d'aller sur les pages appropriées pour foo.h et de changer Propriétés de configuration -> Général -> Type d'élément en "en-tête C/C++" et de faire une compilation propre.
1 votes
@AdrianMcCarthy J'ai eu le même problème et ta suggestion l'a résolu.
1 votes
Le commentaire de @AdrianMcCarthy est la solution. Doit être dû à l'assistant Ajouter-> "Nouvel élément" qui définit automatiquement le type d'élément du fichier.
1 votes
Oui...Je me souviens avoir accidentellement créé le fichier en tant que "Fichier source" puis l'avoir renommé une fois que j'ai remarqué que c'était un fichier .c. Cela n'a clairement pas informé le chaînon d'outils que je ne souhaite pas le compiler en tant qu'objet.
0 votes
Je viens de m'en prendre une et je me suis assuré que l'en-tête était effectivement défini comme un en-tête dans les propriétés, ce qui a résolu le problème avec succès pour moi aussi. Merci!