【问题】VS 2026 C++ 控制台项目:改完代码后第一次生成只编译不链接,运行的是旧 exe
■ 环境
- Windows 11(内部版本 26200)
- Visual Studio Community 2026,版本 18.10.2
- 平台工具集 v145,MSVC 14.51.36231(cl 19.51.36260)
- Windows SDK 10.0.26100.0
- VS 安装在非系统盘:D:\visual studio
- 项目:VS 模板「控制台应用」,只有一个 hello.cpp,配置 Debug | x64
- 解决方案是新格式 .slnx
■ 现象
1. 新建项目,Ctrl+F5 运行 → 正确打印 hello world
2. 把字符串改成别的内容,Ctrl+F5 → 打印的仍然是 hello world(旧内容)
3. 不改代码,再按一次 Ctrl+F5 → 这时才打印出新内容
即:链接永远比编译慢一拍。每改一次代码,需要生成两次才能看到效果。
4. 「重新生成解决方案」(Rebuild) 每次都正常
5. 全程没有任何报错和警告,「输出」窗口显示「生成: 1 成功,0 失败」,
并且照常打印 "Project1.vcxproj -> D:\...\Project1.exe" 这一行
■ 硬证据
- 改完代码生成后:hello.obj 时间戳更新了,读取其二进制内容,新字符串确实在里面(编译成功)
- 同时 Project1.exe 时间戳和内容完全没有变化(链接没执行)
- 详细日志(/v:detailed)里 Link 任务的原文:
任务"Link"
D:\...\PROJECT1\PROJECT1\X64\DEBUG\HELLO.OBJ 的输出
D:\...\PROJECT1\X64\DEBUG\PROJECT1.EXE
D:\...\PROJECT1\X64\DEBUG\PROJECT1.PDB
所有输出均为最新。
而此刻 hello.obj 比 Project1.exe 新 14 秒(obj 00:56:35 / exe 00:56:21)
- 用命令行 MSBuild 直接构建也能复现,加 /nr:false(禁用节点复用)依然复现
→ 说明不是 IDE 界面的问题,在生成系统这一层
■ 已排除
- system("pause") 导致进程驻留锁住 exe(已删除该行,且确认无进程占用 exe)
- .vs 缓存、x64 中间目录残留(全部删除后从零重建,仍复现)
- .slnx 里平台名写 x86 而项目是 Win32(用的是 x64 配置)
- MSBuild 节点复用(/nr:false 仍复现)
- 增量链接(设 LinkIncremental=false 仍复现)
■ 我目前用的绕法
在 .vcxproj 的 Microsoft.Cpp.targets 导入之后加:
链接前删掉旧 exe,链接器就无法判定"最新",必然重新链接。
实测有效,且不影响编译的增量性(不改代码时 hello.obj 不会重新编译)。
■ 想请教的问题
1. 这是 VS 2026 / v145 工具集的已知 bug 吗?有没有官方 issue 或修复版本?
2. 有没有比"每次删 exe"更正规的解法(某个设置或属性)?
3. 这个现象是否和「解决方案用 .slnx 新格式」或「VS 装在非系统盘」有关?非常感谢您的付出!!!