61 votos

Visual Studio 2010 y 2008 no pueden manejar archivos de origen con nombres idénticos en carpetas diferentes?

Pregunta directa: Si tengo dos archivos con el mismo nombre (pero en directorios diferentes), parece que sólo Visual Studio 2005 puede manejar esto de forma transparente? VS 2008 y 2010 requieren un montón de ajustes? Aparte de mi convención de nomenclatura, ¿estoy haciendo algo mal?

Antecedentes:

Estoy desarrollando bibliotecas estadísticas en C++... Tengo dos carpetas:

/ 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

Necesito soportar compilación cruzada -- estoy usando g++/make para compilar estos mismos archivos en una librería en Linux. Funcionan perfectamente.

Yo había estado usando Visual Studio 2005 sin problemas, pero tengo que actualizar a Visual Studio 2008 o 2010 (actualmente babeando sobre la herramienta nsight de nVidia). Sin embargo, estoy teniendo problemas si agrego archivos a un proyecto con el mismo nombre (incluso si están en un directorio diferente). Estoy dispuesto a cambiar mi convención de nomenclatura, pero tengo curiosidad si otros se han encontrado con este problema y han encontrado alguna bien soluciones documentadas

Estoy aún más desconcertado por el hecho de que si actualizo de 2005 proyectos a proyectos de 2010, parece que VS 2010 es es capaz de manejar correctamente dos archivos fuente con el mismo nombre en directorios diferentes; sin embargo, si elimino uno de los archivos duplicados y luego lo añado de nuevo al proyecto me encuentro con la siguiente advertencia:

Distribuciones \Release\Adaptive.obj : advertencia LNK4042: objeto especificado más de una vez; extras ignorados

Ahora tengo el directorio intermedio especificado como $(ProjectName)\$(Configuration) -- Necesito tener mis archivos objeto en una ubicación diferente de mi árbol fuente. Así que puedo ver por qué está copiando los archivos de objetos en la parte superior de uno al otro, pero cuando los proyectos se convierten de 2005 a 2008 o 2010, un montón de compilaciones condicionales se añaden:

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

Estos son accesibles desde la página de Propiedades del archivo fuente en C/C++ -> Output Files -> "Object File Name" & "XML Documentation File Name". Pero si simplemente añado el archivo directamente (o lo quito y lo vuelvo a añadir), VS no se queja hasta que intento compilar, pero tampoco añade nunca las directivas condicionales -- Así que para que las cosas funcionen correctamente, tengo que añadir yo mismo las directivas condicionales para cada configuración. ¿Estoy cometiendo un error o he descubierto un error válido en VS 2008 / 2010?

70voto

M. Tibbits Puntos 3867

Así que @Hans Passant apuntó en la dirección correcta, ¡¡Gracias!! Usted no tiene que enumerar el archivo, una carpeta es suficiente. Entonces, si nos fijamos en las macros definidas en la parte inferior de la lista de VS 2010, verá:

%(RelativeDir)/ Univariate/

El problema, tal como se publicó, era en realidad una versión simplificada de lo que estoy trabajando -- un par de niveles de carpetas en un solo proyecto y hay un par de conflictos de nombres. Por lo tanto, realmente quería alguna manera de simplemente "arreglarlo"...

Si hace clic con el botón derecho del ratón sobre el proyecto en el explorador de soluciones, seleccione C/C++ -> "Output Files" y escriba lo siguiente en la casilla "Object File Name":

$(DirInt)/%(DirRelativa)/

Ten en cuenta que también he seleccionado (Todas las configuraciones, Todas las plataformas) en los desplegables. Esto compilará cada archivo en una jerarquía de directorios que refleja el árbol de fuentes. VS2010 comenzará la compilación creando estos directorios si no existen. Además, para aquellos que odian los espacios en blanco en sus nombres de directorio, esta macro elimina todos los espacios, por lo que no hay necesidad de jugar con comillas dobles cuando se utiliza.

Esto es exactamente lo que yo quería - idéntica a la forma en que mi Makefiles trabajar en el lado de Ubuntu, sin dejar de mantener el árbol de código fuente limpio.

12voto

Hans Passant Puntos 475940

Esto es fácil de arreglar en el IDE. Haz click en el primer archivo de la carpeta, Shift+Click en el último archivo para que todos queden seleccionados. Click derecho, Propiedades, C++, Archivos de Salida. Cambie el Nombre del Archivo Objeto de $(IntDir)\ digamos, $(IntDir)\Univariate\ . Puede repetir la operación para el grupo de ficheros Multivariante, aunque no es estrictamente necesario.

8voto

jalf Puntos 142628

Tienes razón, VS no puede con eso, y nunca podría. El problema de root es que genera un .obj para cada .cpp en el proyecto, y todos se colocan en la misma carpeta. Así que usted termina con múltiples .cpp que se compilan en Adaptive.obj en su caso, por ejemplo.

Al menos ahora el enlazador genera una advertencia al respecto. No siempre era así.

Usted debe ser capaz de trabajar en torno a este asegurándose de que los archivos utilizan diferentes rutas de directorios intermedios, pero es un poco de un hack en torno a algo que debe sea posible.

Por supuesto, siempre puede enviar un informe de error o una solicitud de función en Microsoft Connect

5voto

Christoph Puntos 1

Use Propiedades de Configuración > C/C++ > Archivos de Ouptut> $(IntDir)\%(RelativeDir)\%(Filename)

esto duplicará la estructura de archivos fuente bajo el directorio de depuración y depositará el archivo objeto para cada directorio en una carpeta del mismo nombre bajo el directorio Depurar directorio

1voto

Povilas Puntos 11

También puede ser que crees un archivo .cpp en visual studio y más tarde lo renombres a .h. Aunque el archivo se renombra visual studio todavía lo compila como un archivo cpp y por lo tanto se crean dos archivos obj y se muestra la advertencia del enlazador.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X