【发布时间】: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