已关闭
[issue] cargo 后端经注册表回退选中 VS 14.0 (2015) link.exe,263 字符对象路径 LNK1104 → BF1008 #27
cezarbbb创建于  16 天前关闭于  14 天前
cezarbbb
16 天前 创建
name about title labels
BotForge 问题单 报告 BotForge 中可复现的问题 [Issue] cargo 后端经注册表回退选中 VS 14.0 (2015) link.exe,263 字符对象路径 LNK1104 → BF1008(默认安装位置 minimal 安装被阻断) bug

问题概述

cargo 后端链接器探测经注册表回退选中 VS 14.0 (2015) 的 link.exe(注册表 WOW6432Node\...\SxS\VS7 的 14.0 项是 rustc 回退探测源),该老链接器对长路径处理不当:默认安装位置(%LOCALAPPDATA%\bot-forge,前缀 45 字符)下编译对象路径达 263 字符,触发 LNK1104(对象文件打开失败),minimal 安装被阻断(BF1008/exit8)。首次出现:本版(botforge-win 1.0.3 升级测试)新发现。受影响安装场景:默认安装位置 + 注册表存在 VS 14.0 回退项的 Windows 环境。实际影响:默认安装位置 minimal 必败。根因链(T4.03/T4.03b–f 逐层定位):① rustc 链接器自动探测经注册表回退选中 VS 14.0 而非 vswhere 探测到的 VS2022 14.44;② 托管 MSVC env(INCLUDE/LIB/LIBPATH + msvc-bin PATH 前置)确实注入子进程但不影响 rustc 链接器选择;③ VS 14.0 link.exe(14.00.24247.2)不支持长路径 → LNK1104;④ 独立运行 rustc/cargo 用 VS2022 链接器编译同样长度路径成功。旁路验证:父环境 CARGO_TARGET_*_LINKER/RUSTC_WRAPPER 不透传(clear_env 白名单剔除);CARGO_HOME config 的 [target] linker/[build] rustc-wrapper 对子进程不生效。缓解有效:BOT_FORGE_HOME 指向短路径(如 %USERPROFILE%\bft)后对象路径降至约 238 字符,编译安装成功。修复建议:显式传 -C linker/RUSTC_LINKER、链接器探测优先 vswhere/VS2022、文档化 BOT_FORGE_HOME。

影响范围

项目 内容
执行模式 □ plan ☑ install □ status □ doctor
受影响的工具、资源或目标版本 VS 14.0 (2015) link.exe 14.00.24247.2(注册表回退选中);默认安装位置 %LOCALAPPDATA%\bot-forge(45 字符前缀)
安装后端 ☑ cargo □ archive □ apt-mirror □ 托管 Cargo □ 其他
影响程度 ☑ 阻断
临时规避办法 设置 BOT_FORGE_HOME 指向短路径(实测有效,对象路径 ~238 字符时编译成功)

复现步骤

  1. 默认安装位置(%LOCALAPPDATA%\bot-forge)执行 botforge-win install minimal --yes
  2. 观察编译链接阶段:LNK1104(263 字符对象路径)→ BF1008/exit8
  3. 旁路验证:父 env 传 CARGO_TARGET_*_LINKER/RUSTC_WRAPPER(不透传);CARGO_HOME config 配 [target] linker/[build] rustc-wrapper(不生效)
  4. 缓解对照:BOT_FORGE_HOME 指向短路径后重跑

预期结果

链接器探测选中可用的新版 VS 链接器,默认安装位置 minimal 安装成功。

实际结果

注册表回退选中 VS 14.0 (2015) link.exe,263 字符对象路径 LNK1104 → BF1008/exit8(默认 home 4 次独立复现,错误输出显式给出 VS 14.0 link.exe 路径);两种用户级旁路(env / CARGO_HOME config)均不生效;BOT_FORGE_HOME 短路径缓解有效(~238 字符编译成功)。证据:T4.01g/T4.01h/T4.02/T4.03/T4.03c-d/T4.04/T4.04c/T6.01。T4.01g 实测输出:

bot-forge error
  Error code  BF1008
error: linking with `link.exe` failed: exit code: 1104
  = note: "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\link.exe" "/NOLOGO" …
  = note: LINK : fatal error LNK1104: 无法打开文件“C:\Users\…\bot-forge\work\cargo\rust-bot\
          targets\cd5c6851…\release\build\proc-macro2-…\build_script_build-….rcgu.o”
error: could not compile `parking_lot_core` (build script) due to 1 previous error
exit=8

对象路径实测 263 字符(MAX_PATH=260,T4.01h);独立 cargo 同长度路径用 VS2022 14.44 链接成功(T4.03d);BOT_FORGE_HOME 短路径缓解后对象路径 ~238 字符,rust-bot 2.0.0 编译安装成功(T4.04c)。

各平台确认:黄区 Windows x64 复现(默认 home 4 次独立复现,单区独有记录)。

运行环境与供应信息

项目 内容
BotForge 版本或提交号 botforge-win 1.0.3(--version 自报 1.0.1)
操作系统与架构 Windows x64
Shell PowerShell
配置来源 默认安装位置 %LOCALAPPDATA%\bot-forge;缓解组 BOT_FORGE_HOME 短路径
软件仓库 / 镜像 公共 crates.io
校验和清单 不涉及
相关工具及版本 VS 14.0 link.exe 14.00.24247.2(注册表回退选中);VS2022 14.44(vswhere 探测);注册表 WOW6432Node...\SxS\VS7 14.0(rustc 回退探测源)

安全、性能与恢复证据

  • ☐ 已提供校验和、签名或来源验证结果
  • ☑ 已提供冷缓存/热缓存、执行次数和基线(默认 home 4 次独立复现;短路径对照成功)
  • ☑ 已提供总耗时、并发度、处理器、内存、磁盘或网络数据(对象路径 263 vs ~238 字符量化数据)
  • ☑ 已提供取消、事务日志、失败恢复、回滚或幂等性表现(失败事务可 --abandon 清理;缓解后编译安装成功)
  • ☑ 已说明失败后的残留文件、进程或系统状态(失败遗留 pending journal,abandon 后清理)

附件与提交确认

  • ☑ 已检索现有问题单,确认不是重复问题
  • ☑ 已提供最小复现步骤、预期结果和实际结果
  • ☑ 已提供可核对的安装、校验或恢复证据(如适用)
  • ☑ 已完成日志、配置和附件脱敏

第二部分:中级别(10 项)

likedislike
Ccezarbbb
15 天前 修改了issue 的描述
KKarliosQu成员
14 天前 关联了pull request:feat(msvc): 支持内网离线安装与 Rust 编译环境验证
VVaynNecol成员
14 天前 关闭了 issue