Visual Studio c ++包含字符串最大长度

时间:2012-08-15 12:55:01

标签: c++ visual-studio include

我一直在尝试在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-4.8.2”替换“qt-everywhere-opensource-src-4.8.2”来解决这个问题。结果包括:

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

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

我一直在搜索,但找不到任何参考。我也不能在Qt构建之外复制问题(只是制作任意长的文件名并试图包含它们)。因此,Qt创建的nmake makefile可能会以某种方式运行cl,导致它以某种方式拒绝long包含。{/ p>

有没有人对此有任何其他信息?

7 个答案:

答案 0 :(得分:1)

由于这用于查找包含的文件,我倾向于认为它连接到OS的文件路径限制。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

.NET框架可能存在限制,但尚未找到确切的行。

以下是一些有趣的链接:social msdnblog msdn

答案 3 :(得分:0)

在Windows上使用GCC构建项目时遇到了同样的问题。 这个问题似乎与Path的组合方式有关,

../../../../../../../../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确实包含了一些问题的提示 请注意,替代的,更长的支持路径格式\?\似乎不支持相对路径。

快速修复:请勿使用此类深度的相对路径。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

  

” ../../../../../../../ QT-无处不开源-SRC-5.0.1 / qtbase / SRC / platformsupport / fontdatabases /基本/ qbasicfontdatabase_p.h “

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

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

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

当包含声明中的总字符数等于 120 时,它有用。 这只是一个定量的数字,可以粗略地了解引擎盖下的限制。对于不同版本的编译器,它可能会有所不同。我不认为操作系统有任何决定它。这个瓶颈似乎更多是由于预处理器。