12

我一直在尝试在 Windows 上编译 Qt,我遇到了一个有趣的问题,#includes 失败,错误是包含的文件不存在(“没有这样的文件或目录”)。但是该文件确实存在。执行包含的文件是自动生成的“moc”文件(由 Qt 制作),包含如下内容:

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

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

有问题的文件恰好位于 UNIX 系统上,通过 Samba 共享到 Windows。我能够通过创建符号链接并将受影响文件中的“qt-everywhere-opensource-src-4.8.2”替换为“qt-4.8.2”来解决此问题。结果包括:

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

仅 102 个字符长并且工作得很好。

我四处搜索,找不到任何对此的参考。我也不能在这个 Qt 构建之外复制这个问题(只是制作任意长的文件名并尝试包含它们)。因此nmake,Qt 创建的 makefile 在运行时可能会以某种方式执行某些操作,cl从而导致它以某种方式拒绝长包含。

有没有人对此有任何额外的信息?

4

7 回答 7

1

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

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

于 2012-08-15T12:58:20.533 回答
0

I've encountered the same issue when building projects using GCC on windows. The issue seems to relate to the way in which the Path is assembled,

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

becomes

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

(example may not be to scale, I didn't count characters...)
At this point the path-handling breaks down due to being too long. In our case, forcing the compiler to use a contracted version,

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

would make the problem go away.
MSDN does contain some hints of the problem at http://msdn.microsoft.com/en-us/library/windows/desktop/aa364963(v=vs.85).aspx
Note that the alternative,longer supporting, path format, \?\, does not seem to support relative paths.

Quick Fix: Don't use relative paths of such depth.

于 2012-08-15T22:02:48.420 回答
0

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

这里有一些有趣的链接:在社交 msdn博客 msdn上。

于 2012-08-15T13:17:56.983 回答
0

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

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

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

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

我做了一些修改,一次减少一个文件名字符的数量。五个字符下来,错误消失了。g++突然找到了文件。

在 include 语句中的总字符数等于120时起作用。这只是一个定量数字,可以粗略了解引擎盖下的限制。不同版本的编译器可能会有所不同。我认为操作系统在确定它方面没有任何作用。这个瓶颈似乎更多是由于预处理器。

于 2013-02-18T16:04:12.863 回答
0

您应该只将您要引用的路径添加到编译器选项,而不是使用那些可怕的东西。

于 2012-08-16T13:39:08.100 回答
0

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

我知道这无关紧要,但这只是附加信息。它可能会帮助某人。

于 2012-08-15T13:09:08.187 回答
0

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

于 2013-01-13T08:23:22.740 回答