2012-09-15 73 views
19

Con la opción "Mostrar todos los archivos" en VS, agregué una carpeta y creé una nueva clase en esa carpeta. Como utilizo encabezados precompilados, también necesito incluir el stdafx.h que está en el directorio raíz en relación con el nuevo archivo de clase.¿Cómo incluir stdafx.h desde el directorio raíz?

En mi cpp que tengo

#include "..\stdafx.h" 

Sin embargo, me sale el siguiente error:

error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

Mi opinión es, que el .. debe instruir al compilador para ir un directorio de nivel superior?

Respuesta

-3

se emplean comillas significa que es un archivo de cabecera es el propietario utiliza <> significa que es un fichero de cabecera, si no me equivoco sólo tiene que utilizar #include <stdafx.h> y dejar que el compilador encontrarlo

+1

-1: 'stdafx.h' no es un archivo de sistema. Es un encabezado precompilado. –

+0

No es un tipo de Windows, entonces ¿por qué tiene una extensión .h? –

+0

Porque es un archivo de encabezado. Puede ser precompilado, pero sigue siendo un encabezado. –

2

archivos PCH son extraño, y más aún en Estudio visual. Al compilar un archivo .cpp que utiliza una PCH, VS espera que el primer texto sin comentarios/en blanco sea #include "PCH_NAME_HERE". El PCH_NAME_HERE es exactamente el nombre del PCH. Sin directorios, nada. Solo el nombre del PCH como se especifica en las opciones del compilador.

Si va a hacer este directorio fudging, entonces necesita modificar la configuración del compilador para que el directorio donde está PCH se encuentre en la ruta de búsqueda del directorio. De esta manera, no necesita tener la pieza ..\.

13

Visual C++ le permite definir varias formas de configurar los archivos de encabezado precompilados. El más común es habilitarlo para TODOS los archivos fuente en el nivel de configuración del proyecto, en Propiedades de configuración/C++/Encabezados precompilados, configurando "Encabezado precompilado", seleccione "Usar". La misma ubicación, configurando "Archivo de encabezado precompilado", suele ser "stdafx.h". Todos los archivos obtendrán esta configuración (por lo tanto, la configuración en el proyecto) EXCEPTO ....

Un archivo es responsable de generar el archivo PCH. Ese archivo suele ser el archivo stdafx.cpp en su proyecto, y normalmente no tiene nada, excepto #include "stdafx.h". Configurando Encabezados Precompilados para ESE ÚNICO ARCHIVO, cambie de "Usar" a "Crear". Esto garantiza que si el encabezado principal para PCH no está sincronizado, stdafx.cpp SIEMPRE se compila para regenerar el archivo de datos PCH. Hay otras formas de configurar PCH en Visual Studio, pero esta es la más común.

Habiendo dicho eso, su problema definitivamente es irritante. El nombre de archivo utilizado para cebar el sistema PCH y especificado en las configuraciones "Usar ..." y "Crear ..." arriba de DEBE COINCIDIR CON EL TEXTO EN SU #include EXACTAMENTE.

Por lo tanto, es muy probable que pueda solucionar su problema añadiendo ".." a su proyecto y incluya directorios y eliminando el ".." de su declaración #include. también podría cambiarlo en el nivel de configuración del proyecto para que sea ".. \ stdafx.h" como el encabezado pasante, pero podría ser un problema si tiene jerárquicamente archivos fuente en varias carpetas.

Ah, y si no estaba claro para usted mientras examinaba la configuración de PCH, si NO desea utilizar PCH para ningún archivo fuente específico (y hay razones para no hacerlo a veces) puede desactivarlo para archivos fuente específicos; de lo contrario, asegúrese de tener siempre #include "your-pch-include-file.h" al principio de cada archivo fuente (c/cpp, etc.).

Espero que tomes un descanso.

+0

Oye, gracias por la respuesta, pero creo que podría haberte entendido mal. No hay configuración de "Usar encabezado precompilado" disponible en las Propiedades de configuración. Además, agregué "..." a Propiedades de configuración -> C \ C++ -> General -> Incluir directorios adicionales y a Propiedades de configuración -> Direcciones de VC++ -> Incluir directorios. Ninguno de los dos funciona. – Dante

+0

Actualicé para reflejar la configuración de la ruta de configuración de VS2010. Si agrega ".." a la ruta include, también debe * eliminarla * de las #include decls para "stdafx.h" en sus archivos c/cpp. – WhozCraig

+0

Quité la parte ".. \" del archivo stdafx.h del archivo cpp, que está en la carpeta separada. Todos los demás archivos se compilan bien, pero el de la carpeta separada produce ahora un error "error C1083: no se puede abrir el archivo de inclusión: 'stdafx.h': no ​​existe dicho archivo o directorio". – Dante

3

Puede ajustar la configuración del encabezado precompilado por archivo.

  1. En el Explorador de soluciones, haga clic derecho en el archivo .cpp, seleccione "Propiedades".
  2. Recomiendo encarecidamente seleccionar "Todas las configuraciones" en el elemento de la lista desplegable Configuración.
  3. Examinar "C/C++" - "Encabezados precompilados".
  4. Ajuste el "Archivo de encabezado precompilado" de "stdafx.h" a lo que necesite (en su caso, por ejemplo, "../stdafx.h").

en cuenta esto es tedioso y propenso a errores, ya que se realiza en función de cada archivo y futuros desarrolladores agregar archivos a su proyecto tendrá que seguir los mismos pasos. Si no lo hacen, se enfrentarán con advertencias y errores tales como:

  • warning C4627: '#include "<path>"': skipped when looking for precompiled header use.

y

  • fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

que no dan mucho indicación en cuanto a este o cualquier otro enfoque.

Supongo que eventualmente recurrirán a StackOverflow y terminarán aquí ... Hola, gracias por leer.

Sobre esta base, vale la pena ir con alternativas, como poner $(ProjectDir) en la ruta Incluir C++ (en C++ \ General) pero eso puede causar confusión al incluir otros archivos de encabezado.

-1

Si los archivos .cpp y .h de su proyecto viven en subdirectorios diferentes (no claramente en el directorio del proyecto), sería un buen estilo de codificación usar rutas de acceso relativas al directorio de la solución (si no lo hace) t usar un directorio de inclusión dedicado). Particularmente si tiene varios proyectos en una solución y necesita compartir archivos de inclusión (por ejemplo, para interoperabilidad entre proyectos, por ejemplo, un .exe y un .dll).

refactorizar su proyecto que tiene que hacer lo siguiente:

  1. En cada proyecto especifique adicionales incluyen directorio $ (SolutionDir): haga clic derecho en el proyecto, haga clic en "Propiedades", vaya a "Configuración Propiedades "->" C/C++ "->" General "(para hacer esto para todas las configuraciones a la vez, seleccione" Todas las configuraciones "desde el menú desplegable" Configuración " )
  2. Ir a" C/C++ "-> "Encabezados precompilados" y cambie el valor "Archivo de encabezado precompilado" a la ruta relativa a el directorio de la solución, p. PROJECT_NAME/stdafx.hy
  3. En su .cpp archivos incluyen "PROJECT_NAME/stdafx.h", en lugar de sólo "stdafx.h"
  4. En sus archivos .cpp y .h, al incluir algo, camino de su uso como "PROJECT_NAME/dir1/dir2/file.h", excepto cuando se incluye el archivo desde el mismo directorio
+0

Usar rutas de acceso incluidas es una muy mala idea. Copiar la fuente a otra máquina, o incluso reconfigurar la máquina en la que la fuente ya está encendida, no hará que compile nada. Además, Visual Studio aún se quejará si incluye stdafx.h utilizando una ruta de acceso enrutada, ya que no usa el algoritmo de resolución de ruta estándar para localizar el archivo stdafx.h, tiene algún mecanismo de búsqueda personalizado (imo half-arsed) que en realidad la causa del problema – Neutrino

+0

@Neutrino, no quise decir rutas de inclusión completamente rooteadas, como comenzar con una letra de unidad, p. 'C:'. He editado la respuesta para que el significado sea más claro: quise decir directorio de solución o un directorio 'include' dedicado como raíz, de modo que los archivos de inclusión estén referenciados por rutas relativas a esos directorios. Eso no supone ningún problema para mover toda la solución entre computadoras o directorios en la misma computadora. –

+0

@Neutrino, también, he verificado la sugerencia de utilizar rutas relativas a la solución como '#include" PROJECT_NAME \ stdafx.h "', funciona si se siguen los pasos descritos anteriormente. Si lo intentaste y no funcionó, ¿cuál fue el error? –

0

La causa de la confusión es que trata de Visual Studio la incluyen directiva que incluye el encabezado precompilado diferente a los otros incluyen directivas. En concreto no se ve para el precompilado encabezado utilizando el enfoque de búsqueda de ruta normal, en su lugar, simplemente intenta hacer coincidir la directiva include con la definida en la configuración del proyecto por simple comparación de cadenas.

La configuración del encabezado del precompilador se establece de forma manual pero puede anularse por archivo. (se accede a través de Propiedades del proyecto -> Propiedades de configuración -> C/C++ -> Encabezados precompilados) es:

Precompiled Header: Use (/Yu) 
Precompiled Header File: stdafx.h 
Precompiled Header Output File: $(IntDir)$(TargetName).pch 

Esta configuración se aplica a todos los archivos del proyecto de forma predeterminada. Sin embargo, la configuración para stdafx.cpp se establece en el nivel de archivo y sustituye el valor del encabezado precompilado a:

Precompiled Header: Create (/Yuc) 

El efecto de esto es que para cualquier archivo de origen configurado para utilizar el encabezado precompilado (que por por defecto son todos excepto stdafx.cpp) VS buscará una directiva de inclusión que coincida con el valor del archivo de encabezado precompilado configurado. p.ej.

#include "stdafx.h" 

Debido a que el cheque utiliza una sencilla comparación de cadenas en lugar de cualquier tipo de búsqueda en el directorio, entonces (con independencia de la ubicación del archivo de origen en relación con el directorio raíz del proyecto o la ubicación del archivo stdafx.h) del La ruta y el nombre de archivo utilizados en la directiva include deben coincidir con exactamente que usa la configuración del archivo de encabezado precompilado del proyecto. El efecto secundario inesperado de esto es que si tiene un subdirectorio de proyecto que contiene varios archivos fuente, en esos archivos no necesita hacer referencia al archivo stdafx.h utilizando una ruta relativa como ... \ stdafx.h (y si lo hace VS generará un error que indica que se encontró con el final del archivo mientras buscaba el encabezado precompilado).

Simplemente use el #include "stdafx.h" sin adornos y funcionará bien porque VS lo reconocerá como la directiva para usar el encabezado precompilado, y ya sabe dónde está el encabezado precompilado correcto debido a stdafx.cpp La configuración del encabezado precompilado se establece en "Crear (/ Yc)".

5

por lo general también les gusta tener un orden jerárquico en mis proyectos, y he encontrado que hay dos formas sencillas para incluir un encabezado precompilado:

De cualquier

  1. poner el directorio donde stdafx.h se encuentra en los directorios de inclusión del compilador.

    (Propiedades - Directorios de VC++ - Incluir directorios: Añadir $(ProjectDir))

O

  1. Si no hay demasiados muchos subdirectorios, una forma simple de eludir el mensaje de error es la siguiente:

    • Deja un archivo stdafx.h en cada uno de sus subdirectorios que sólo incluye el nivel superior stdafx.h:
      #include "..\stdafx.h"
    • Escribir #include "stdafx.h" como primera línea de todos los archivos de origen en sus subdirectorios, en lugar de incluir el archivo de nivel superior allí.

De esta manera, todos los archivos de código utilizan el mismo archivo de encabezado precompilado, y no hay otra instalación complicada de hacer.

6

Es interesante que el truco que utilizo no está en las respuestas:

  1. Crear Stdafx.hy stdafx.cpp en la carpeta raíz del proyecto.
  2. Ir a las propiedades del proyecto -> encabezados precompilados. Cambiar a "usar".
  3. Vaya a stdafx.cpp, haga clic con el botón derecho en propiedades -> encabezados precompilados. Cambiar a "crear".
  4. Ir a las propiedades del proyecto -> avanzado; cambio "Fuerza incluir archivos" para StdAfx.h;% (ForcedIncludeFiles)

No cambiar cualquier archivo CPP; Mantenga sus archivos de encabezado tal como están. Build as-is.

Sin tipeo, sin RSI, sin problemas con incluir rutas, ningún otro dolor y miseria. Y la belleza es que seguirá funcionando cuando mueva su solución a otra plataforma. Increíble.

0

sugeriría a utilizar:

$(ProjectDir)/pch/my_pch.h 

como "encabezado precompilado archivo"
y "Advanced> Fuerza archivo de inclusión"

Esta automático incluirá pch para sus .cpp archivos al principio, por lo que no es necesario cambiar nada en los archivos .cpp.

Y esto es mejor que cambiar el directorio de inclusión, porque a veces puede tener varios archivos pch en los directorios de inclusión, y luego no puede decir cuál se ha utilizado.

Cuestiones relacionadas