2012-08-15 13 views
11

He estado tratando de compilar Qt en Windows y me he encontrado con un problema interesante # incluye en su defecto con el error de que el archivo está incluido no existe ("No existe el fichero o directorio"). Sin embargo, el archivo existe. Los archivos que hacen el incluyendo archivos son generados automáticamente "moc" (hechas por Qt) que tienen un include como la siguiente:Visual Studio C++ incluye cadena de longitud máxima

#include "../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h"

la cadena en que incluyen es de 127 caracteres de longitud. Hay muchos archivos "moc" producidos y compilados en la compilación, pero solo fallan los que tienen longitudes muy largas como esta (más de 127 caracteres).

Los archivos en cuestión resultan ser sentado en un sistema UNIX, compartida a través de Samba a Windows. Pude solucionar el problema creando un enlace simbólico y reemplazando "qt-everywhere-opensource-src-4.8.2" con "qt-4.8.2" en los archivos afectados. El resultantes incluyen:

#include "../../../../../../../../qt-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h"

es sólo 102 caracteres de longitud y funciona muy bien.

He buscado y no he podido encontrar ninguna referencia al respecto. Tampoco podría replicar el problema fuera de esta compilación de Qt (simplemente haciendo nombres de archivo arbitrariamente largos e intentando incluirlos). Por lo tanto, es posible que de alguna manera los makefiles nmake que crea Qt estén haciendo algo cuando ejecutan cl que provocan que rechace largo, incluye de alguna manera.

¿Alguien tiene información adicional sobre esto?

+0

¿cuál es la longitud de la ruta absoluta en ambos casos? es decir, al resolver los diversos ../../. Hay un límite de ruta máximo de 256 caracteres en la mayoría de los sistemas de Windows antiguos. – TemplateRex

+0

La ruta completa para este ejemplo es de 132 y 106 caracteres, respectivamente. Pero el sistema operativo no tiene problemas para abrir el archivo (es decir, en el Bloc de notas o en el shell de cmd). por cierto, olvidé mencionar que estoy usando MSVS 2008. –

+0

Utilicé una montura Samba cuando no pude replicar el problema. Basado en algunos otros comentarios que encontré en línea, pensé que podría ser la longitud del directorio y no la longitud del archivo, así que hice algunos directorios falsos realmente largos, pero aún así no hay problema. Pero luego intenté poner el archivo fuente en el directorio largo e incluyendo ... /../really-long-dir/7890123...890/a.h y obtuve el error. Eso sucede hasta aproximadamente 131 caracteres. Pero puedo tener longitudes de camino total más largas con menos ".." en la ruta. Muy raro. Me pregunto si esto es un error en el preprocesador. –

Respuesta

1

Dado que este se utiliza para encontrar el archivo incluido, tiendo a creer que está conectada a las restricciones de la ruta del archivo del sistema operativo'.

Tal vez la implementación del preprocesador de alguna manera limita también, pero eso sería específica para cada compilador.

0

En uno de mis lugares de trabajo en el pasado, tuvimos otro problema similar. El proyecto era muy grande y tenía tantos archivos que el comando del compilador que Visual Studio genera al construir el proyecto era tan largo que excedía cierto límite y la compilación fallaba. Esto, sin embargo, estaba sucediendo en Visual Studio 2008, no sé de los más nuevos.

Sé que no tiene relación, pero esto es sólo información adicional. Puede ayudar a alguien.

0

Podría haber una limitación establecida por el marco .NET, pero no han encontrado la línea exacta de esto todavía.

Aquí hay algunos enlaces interesantes sobre esto: en social msdn y blog msdn.

0

Me he encontrado con el mismo problema al construir proyectos usando GCC en Windows. El problema parece estar relacionado con la forma en la que se monta el Camino,

../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

convierte

c:/some/working/structure/that_is/at_least/as_deep/as_the_up/levels/are/../../../../../../../../qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

(ejemplo puede no estar a escala, que no contaba caracteres. ..)
En este punto, la ruta de acceso se rompe debido a que es demasiado larga.En nuestro caso, lo que obliga al compilador que utilice una versión contratada,

c:/some/qt-everywhere-opensource-src-4.8.2/examples/tools/plugandpaintplugins/extrafilters/extrafiltersplugin.h

haría que el problema desaparezca.
MSDN contiene algunos indicios del problema en http://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx
Tenga en cuenta que el formato de ruta de acceso alternativo, más largo, \? \, No parece admitir rutas relativas.

Solución rápida: No utilice rutas relativas de tal profundidad.

0

Simplemente debe agregar la ruta a la que está refiriendo a las opciones del compilador, en lugar de utilizar algo ESO horrible.

+0

Tanto el archivo MAKE como los incluidos en cuestión son autogenerados por el sistema de compilación Qt. Tengo un control limitado sobre ellos. Afortunadamente, esta es una compilación única, no algo que hago todos los días. –

0

Seleccionar la pestaña 'proyecto' y desmarcar 'Shadow build' resolvió mi problema.

0

me encontré exactamente el mismo problema recientemente, al construir qt en Windows usando msys & mingw. El sistema de compilación no pudo encontrar el archivo de encabezado incluido a través de la ruta relativa siguiente:

"../../../../../../../qt-everywhere-opensource-src- 5.0.1/qtbase/src/platformsupport/fontdatabases/básico/qbasicfontdatabase_p.h"

Pero archivo estaba presente y era el camino correcto, así.

Creé una estructura de archivos similar fuera del árbol de fuentes qt y pude reproducir el problema usando g ++ desde la línea de comandos.

He modificado un poco, reduciendo el número de caracteres de nombre de archivo de uno en uno. Cinco caracteres abajo y los errores desaparecieron. g ++ de repente encontró el archivo.

Funcionó cuando el total de caracteres en la instrucción include era igual a . Esta es solo una cifra cuantitativa para dar una idea aproximada de lo que podría ser el límite bajo el capó. Puede ser diferente para diferentes versiones del compilador. No creo que el sistema operativo tenga ningún papel en determinarlo. Este cuello de botella parece más debido al preprocesador.

Cuestiones relacionadas