2012-08-15 76 views
11

我一直在试图在Windows上编译Qt,并且遇到了一个有趣的问题,其中#includes失败,包含的文件不存在(“没有这样的文件或目录”)。但是该文件确实存在。做包括的文件是自动生成的“MOC”文件(由Qt的制造)有一个包含类似如下:Visual Studio C++包括字符串最大长度

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

字符串中包含长127个字符。在构建中生成和编译了许多“moc”文件,但只有像这样长(127+个字符)的文件才会失败。

有问题的文件碰巧坐在UNIX系统上,通过Samba共享到Windows。我能够通过创建符号链接并在受影响的文件中用“qt-4.8.2”替换“qt-everywhere-opensource-src-4.8.2”来解决此问题。所产生的包括:

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

只有102个字符,并且工作得很好。

我周围搜索,找不到任何这方面的参考。我也不能在Qt构建之外复制问题(只是制作任意长的文件名并尝试包含它们)。所以Qt创建的makefile可能会在运行cl时做某些事情,导致它以某种方式拒绝长期包含。

有没有人有关于此的任何其他信息?

+0

这两种情况下绝对路径的长度是多少?即解决各种../../时。在大多数旧的Windows系统中,最大路径限制为256个字符。 – TemplateRex 2012-08-15 13:08:55

+0

本例的完整路径分别是132和106个字符。但是操作系统在打开文件时(即在记事本或cmd shell中)没有问题。 btw,我忘了提及我正在使用MSVS 2008. – 2012-08-15 14:43:48

+0

当我无法复制问题时,我确实使用了Samba安装。根据我在网上找到的其他评论,我认为它可能是目录长度而不是文件长度,所以我做了一些非常长的假目录,但仍然没有问题。但后来我试图把源文件放在长目录中,包括../../really-long-dir/7890123...890/a.h,我得到了错误。这发生在约131个字符。但是我可以在路径中使用更少的“..”来获得更长的总路径长度。很奇怪。我想知道这是否是预处理器中的错误。 – 2012-08-15 19:57:39

回答

1

由于这是用来查找包含的文件,我倾向于认为它连接到操作系统的文件路径限制。

也许预处理程序的实现方式也会限制它,但这对于每个编译器都是特定的。

0

在过去的工作地点之一,我们遇到了另一个类似的问题。该项目非常庞大,文件非常多,以至于Visual Studio在构建项目时生成的编译器命令太长,以至于超过了某些限制并且编译失败。然而,这发生在Visual Studio 2008上,我不知道更新的。

我知道它是无关的,但这只是附加信息。它可以帮助某人。

0

可能有一个由.NET框架设置的限制,但还没有找到确切的线。

这里有一些有趣的链接:在social msdnblog msdn

0

我在Windows上使用GCC构建项目时遇到了同样的问题。 这个问题似乎涉及到其中的路径是组装的方式,

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

成为

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

(例如可能不按比例,我没算个字符。 ..)
此时,路径处理由于时间太长而中断。在我们的情况下,强制编译器将使用约定版本,

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

会让问题消失。
MSDN在http://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx
确实包含一些问题的提示请注意,替代的较长的支持路径格式\?\似乎不支持相对路径。

快速修复:不要使用这种深度的相对路径。

0

您应该将您正在使用的路径添加到编译器选项,而不是使用可怕的东西。

+0

makefile和包含的问题都是由Qt构建系统自动生成的。我对他们的控制有限。幸运的是,这是一次性构建,而不是我每天都在做的事情。 – 2012-08-16 19:02:57

0

选择'项目'选项卡并取消选中'阴影构建'解决了我的问题。

0

我在最近使用msys & mingw在windows上构建qt时遇到了完全相同的问题。构建系统无法找到通过以下相对路径包含的头文件:

“../../../../../../../qt-everywhere-opensource-src- 5.0.1/qtbase/src/platformsupport/fontdatabases/basic/qbasicfontdatabase_p.h“

但是文件存在,路径也正确。

我在qt源码树之外创建了一个类似的文件结构,并能够使用g ++从命令行重现问题。

我减少了一点,通过减少一次一个文件名字符的数量。五个字符下降,错误消失。 g ++突然发现了这个文件。

它在包含语句中的总字符等于。 这只是一个定量的数字,可以给出一个粗略的想法,可能是什么可能是引擎盖下的限制。对于不同版本的编译器可能会有所不同。我不认为操作系统在确定它有任何部分。这个瓶颈似乎更多是由于预处理器。