【问题标题】:How to handle long paths in cmd.exe如何处理 cmd.exe 中的长路径
【发布时间】:2019-11-22 10:52:24
【问题描述】:

我正在帮助一些开发人员创建一个 Linux 项目的 Windows 端口,其中源代码树非常深,总路径长度远远超过 260 个字符。至少现在,只需要运行 gcc 编译。源码树共享Linux/Windows,对外维护;修改树结构或更改文件名(例如符号链接,或使用 subst 挂载子树)不是可行的替代方案。

更复杂的是:构建将在 Windows 风格的 Docker 容器中进行。因此解决方案仅限于那些可以在 Windows docker 基础镜像上运行的解决方案。

我已将 HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled 值设置为 1,并且我假设如果我创建自己的应用程序,我可以提供一个具有 true 的应用程序清单。但我不是在创建 gcc,那么如何告诉 cmd.exe gcc 不限于 260 个字符的路径长度? (仅设置注册表变量是不够的!)

从 cmd.exe 运行 gcc 是否需要 cmd.exe 可以处理长路径 - 可以吗?我可以使用另一个可以处理长路径的 shell(并且不受任何底层 cmd.exe 的限制吗?

【问题讨论】:

  • CMD 支持 Windows 10 中的长 DOS 路径,用于其自己的工作目录和内部命令的参数。但是,Windows 不允许子进程的继承工作目录超过MAX_PATH - 2,无论是否启用长路径。除此之外,是否支持长 DOS 路径取决于每个进程——在这种情况下是 gcc.exe。如果它不支持长 DOS 路径,它可能支持长路径作为非规范化设备路径,即仅使用反斜杠(至少在 WINAPI 中)并以“\\?\”开头的完全限定的 Unicode 路径本地设备对象目录。

标签: windows docker path


【解决方案1】:

为什么不完全避免使用 cmd.exe? 只需使用 MSYS2 shell (https://www.msys2.org/)。

这解决了很多移植问题,实际上允许您使用相同的构建工具(autoconf 甚至 cmake 和 meson)。

我在 Windows 上使用这个环境已经很多年了。事实上,我完全像这样构建了最新的 GCC 和 MinGW-w64(参见:http://winlibs.com/)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多