【问题标题】:Visual Studio c++ include string maximum lengthVisual Studio C++ 包含字符串最大长度
【发布时间】:2012-08-15 12:55:01
【问题描述】:

我一直在尝试在 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 构建之外复制这个问题(只是制作任意长的文件名并尝试包含它们)。因此,Qt 创建的 nmake makefile 在运行 cl 时可能会以某种方式执行某些操作,从而导致它以某种方式拒绝长包含。

有没有人知道这方面的更多信息?

【问题讨论】:

  • 两种情况下绝对路径的长度是多少?即在解决各种 ../../.大多数旧 Windows 系统上的最大路径限制为 256 个字符。
  • 此示例的完整路径分别为 132 和 106 个字符。但是操作系统可以毫无问题地打开文件(即在记事本或 cmd shell 中)。顺便说一句,我忘了提到我正在使用 MSVS 2008。
  • 当我无法复制问题时,我确实使用了 Samba 挂载。基于我在网上找到的其他一些 cmets,我认为这可能是目录长度而不是文件长度,所以我制作了一些非常长的假目录,但仍然没有问题。但是后来我尝试将源文件放在长目录中并包括 ../../really-long-dir/7890123...890/a.h 并且我得到了错误。最多有 131 个字符。但是我可以在路径中使用更少的“..”来获得更长的总路径长度。很奇怪。我想知道这是否是预处理器中的错误。

标签: c++ visual-studio include


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • makefile 和相关的包含都是由 Qt 构建系统自动生成的。我对它们的控制有限。幸运的是,这是一次性构建,而不是我每天都在做的事情。
          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-11-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多