62 votes

Visual Studio 2010 & 2008 ne peuvent pas gérer les fichiers source avec des noms identiques dans des dossiers différents?

Question: Si j'ai deux fichiers avec le même nom (mais dans des répertoires différents), il apparaît que seulement Visual Studio 2005 peut gérer cela de manière transparente?? VS 2008 et 2010 besoin d'un tas de peaufinage? À part ma convention de nommage, suis-je en train de faire quelque chose de mal?

Arrière-plan:

Je suis en développement C++ statistiques des bibliothèques... j'ai deux dossiers:

/ Univariate

Normal.cpp
Normal.h
Beta.cpp
Beta.h
Adaptive.cpp
Adaptive.h

/ Multivariate

Normal.cpp
Normal.h
Beta.cpp
Beta.h
Adaptive.cpp
Adaptive.h

J'ai besoin de l'appui de la croix de compilation -- j'utilise g++/make pour compiler ces mêmes fichiers dans une bibliothèque dans Linux. Ils fonctionnent très bien.

J'avais été à l'aide de Visual Studio 2005, sans problème, mais j'ai besoin de mettre à niveau vers Visual Studio 2008 ou 2010 (actuellement baver sur nVidia nsight outil). Cependant, je vais avoir des ennuis si je ajouter des fichiers à un projet avec le même nom (même si ils sont dans un autre répertoire). Je suis prêt à changer ma convention de nommage, mais je suis curieux de savoir si d'autres personnes ont rencontré ce problème et ont trouvé tout bien documentée des solutions??

Je suis encore ahuri par le fait que si je mettre à niveau à partir de 2005, des projets à projets 2010, il semble que VS 2010 est en mesure de gérer correctement les deux fichiers avec le même nom dans des répertoires différents; cependant, si je supprime l'un des fichiers en double, puis l'ajouter au projet, je suis accueilli par le message d'avertissement suivant:

Les Distributions\Release\Adaptative.obj : avertissement LNK4042: objet spécifié plus d'une fois; extras ignoré

Maintenant, j'ai l'intermédiaire du répertoire spécifié par $(ProjectName)\$(Configuration) -- j'ai besoin d'avoir mes fichiers objets dans un endroit différent de mon arbre source. Donc, je peux voir pourquoi il est de la copie des fichiers de l'objet sur le dessus les uns des autres, mais quand les projets sont convertis à partir de 2005 à 2008 ou 2010, un groupe de mise en compile sont ajoutés:

<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>

Ceux-ci sont accessibles à partir du fichier Source de la page de Propriétés en C/C++ -> Fichiers de Sortie - > Objet "Nom de Fichier" & "Documentation XML Nom de Fichier". Mais si j'ajoute simplement le fichier directement (ou de les supprimer et de les rajouter), VS ne se plaint pas jusqu'à ce que j'essaie de compiler, mais aussi de ne jamais ajoute les directives conditionnelles -- Donc, pour que les choses fonctionnent correctement, j'ai du ajouter les directives conditionnelles moi-même pour chaque configuration. Suis-je fait une erreur ou mauvaise hypothèse ou j'ai découvert un valide bug dans VS 2008 / 2010?

73voto

M. Tibbits Points 3867

Donc @Hans Passant orienté dans le bon sens, Merci!! Vous n'avez pas de liste le fichier, un dossier est suffisant. Ensuite, si vous regardez dans les macros définies dans le bas de la VS 2010 liste, vous verrez:

%(RelativeDir)/ Univariée/

Le problème, comme indiqué, était en fait une version simplifiée de ce que je suis en train de travailler sur -- un couple de niveaux de dossiers dans un seul projet, et il ya un couple de conflits de nom. Donc, je voulais vraiment qu'à simplement "réparer"...

Si vous faites un clic droit sur le projet dans l'explorateur de solutions, sélectionnez C/C++ -> "Fichiers de Sortie" et tapez la commande suivante dans l'Objet "zone" Nom du Fichier:

$(IntDir)/%(RelativeDir)/

Notez que j'ai aussi sélectionné (Toutes les Configurations, Toutes plates-formes) à partir des menus déroulants. Cela permettra de compiler chaque fichier dans un répertoire de la hiérarchie qui reflète l'arbre source. VS2010 va commencer à le construire par la création de ces répertoires s'ils n'existent pas. De plus, pour ceux qui détestent l'espace blanc dans leur répertoire de noms, cette macro ne retirez tous les espaces, donc il n'est pas nécessaire de jouer avec des guillemets lorsque vous l'utilisez.

C'est exactement ce que je voulais -- identique à la façon de mon Makefile travail sur la Ubuntu côté, tout en gardant l'arborescence des sources propres.

13voto

Hans Passant Points 475940

C'est facile à corriger dans l'EDI. Cliquez sur le premier fichier du dossier, Maj + clic sur le dernier fichier pour les sélectionner tous. Cliquez avec le bouton droit de la souris sur Propriétés, C ++, Fichiers de sortie. Modifiez le nom du fichier objet de $(IntDir)\ à, par exemple, $(IntDir)\Univariate\ . Vous pouvez répéter l'opération pour le groupe de fichiers multivarié bien que cela ne soit pas strictement nécessaire.

9voto

jalf Points 142628

Vous avez raison, VS ne peut pas gérer, et ne pourrait jamais. La racine du problème, c'est qu'il génère un .obj le dossier de chaque .cpp le fichier dans le projet, et ils sont tous placés dans le même dossier. Si vous vous retrouvez avec plusieurs .cpp fichiers de compilation pour Adaptive.obj dans votre cas, par exemple.

Au moins l'éditeur de liens génère un avertissement pour elle maintenant. Ce n'était pas toujours le cas.

Vous devriez être en mesure de contourner ce problème en veillant à l'utilisation des fichiers Intermédiaires différents chemins de Répertoire, mais c'est un peu un hack autour de quelque chose qui devrait être possible.

Bien sûr, vous pouvez toujours déposer un rapport de bug ou demande de fonctionnalité sur sur Microsoft Connect

5voto

Christoph Points 1

utilisez les Propriétés de configuration> C / C ++> Fichiers Ouptut> $ (IntDir) \% (RelativeDir) \% (Nom du fichier)

cela dupliquera la structure du fichier source sous le répertoire de débogage et déposera le fichier objet pour chaque répertoire dans un dossier du même nom sous le répertoire Debug

1voto

Povilas Points 11

Il se peut également que vous créiez un fichier .cpp dans Visual Studio et que vous le renommiez plus tard en .h. Bien que le fichier soit renommé, visual studio le compile toujours en tant que fichier cpp. Par conséquent, deux fichiers obj sont créés et l’avertissement de l’éditeur de liens affiché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X