需求与已有讨论的关系
相关但独立的通用参数配置请求:#717(目标条件下的 dialect_cxxflags)。CRT 语义配置完善后,本项目可不再手写该参数,但 #717 仍适用于其他平台专用的模块图参数。
希望完善 Windows MSVC ABI 下的 CRT 选择,使同一个语义配置能够覆盖 cl、clang-cl 和普通 clang++,并统一用于源码编译、标准库模块和缓存。
这是 #649 E10 的后续功能请求:
使用场景
- Windows,mcpp
2026.9.26.2,LLVM 22.1.8,普通 clang++ 驱动,目标为 Windows MSVC ABI。
- GalTranslPP 使用 C++23 模块、
import std;,并使用 Qt/vcpkg 提供的动态 release CRT 库。
- release 构建仍生成 PDB,即启用调试信息,但不希望切换到 debug CRT。
- 当前项目用以下底层参数显式选择 CRT:
[build]
dialect_cxxflags = ["-fms-runtime-lib=dll"]
这能让参数同时到达项目源码及 std BMI,但项目需要知道驱动拼写和模块参数通道,还存在平台条件声明的问题。
按本地源码 52549fbb2d17939e89efb1e05e0c2717bf30d96c:
本次诉求是对普通 clang++ / MSVC ABI 补齐语义配置,不是要求改变其他平台的默认运行库策略。
配置形式:供讨论,不限定必须新增字段
若现有 linkage / cxx_runtime 足够表达需求,可以完善现有机制并明确文档,避免重复配置。
若需要直接表达 CRT 选择,可考虑沿用现有 ABI 配置位置,例如:
# 提议的新字段,目前不可直接使用
[target.windows.abi]
msvc_crt_linkage = "dynamic" # static / dynamic
msvc_crt_variant = "release" # release / debug
是否支持 debug CRT 可以分阶段决定;当前项目的直接需求是普通 clang++ 下显式选择动态 release CRT。
两个维度的预期映射:
| CRT 链接方式 |
CRT 变体 |
cl / clang-cl |
普通 clang++,Windows MSVC ABI |
| dynamic |
release |
/MD |
-fms-runtime-lib=dll |
| static |
release |
/MT |
-fms-runtime-lib=static |
| dynamic |
debug |
/MDd |
-fms-runtime-lib=dll_dbg |
| static |
debug |
/MTd |
-fms-runtime-lib=static_dbg |
debug = true 表示调试信息需求,不应自动等价于 debug CRT。
期望行为
- 根据目标 ABI 和编译器驱动生成参数,而不是仅凭宿主 OS 或 GNU/CL 参数风格判断。
- 同一个解析后的 CRT 选择用于相关 C/C++ 编译、模块扫描、std/std.compat BMI 和链接。
- CRT 选择进入相关缓存标识,切换后不复用另一 CRT 配置的模块/对象。
- 对 Linux、macOS、MinGW 等不适用目标,不泄漏 MSVC 专用参数;明确不适用配置的诊断或跳过规则。
- 与
linkage、cxx_runtime 及已有默认行为统一解析,记录优先级;对已知矛盾给出明确诊断,不输出互相覆盖的 CRT 参数。
- 运行库事实记录和部署/打包对运行库依赖的判断也应反映实际选择,避免只改编译参数却保留静态 CRT 的记录。
- 不承诺替用户重建外部预编译库;文档说明它们仍需与选用的 CRT 配置相容。
建议验证
- 相同 CRT 选择在各支持驱动下生成对应参数。
- 包含
import std; 的最小程序能够编译链接,TU 与标准库 BMI 使用一致配置。
- static/dynamic 切换后缓存正确失效,产物的运行库依赖符合声明。
- release CRT + 调试信息能够共存。
- 非适用目标不收到 MSVC CRT 参数。
不要求本 issue 一次实现所有配置维度,但希望先有受支持的方式,让 LLVM/clang++ 行显式选择动态 release CRT,并让 std BMI、缓存及运行库记录保持一致。
需求与已有讨论的关系
相关但独立的通用参数配置请求:#717(目标条件下的 dialect_cxxflags)。CRT 语义配置完善后,本项目可不再手写该参数,但 #717 仍适用于其他平台专用的模块图参数。
希望完善 Windows MSVC ABI 下的 CRT 选择,使同一个语义配置能够覆盖
cl、clang-cl和普通clang++,并统一用于源码编译、标准库模块和缓存。这是 #649 E10 的后续功能请求:
使用场景
2026.9.26.2,LLVM22.1.8,普通clang++驱动,目标为 Windows MSVC ABI。import std;,并使用 Qt/vcpkg 提供的动态 release CRT 库。这能让参数同时到达项目源码及 std BMI,但项目需要知道驱动拼写和模块参数通道,还存在平台条件声明的问题。
按本地源码
52549fbb2d17939e89efb1e05e0c2717bf30d96c:本次诉求是对普通 clang++ / MSVC ABI 补齐语义配置,不是要求改变其他平台的默认运行库策略。
配置形式:供讨论,不限定必须新增字段
若现有
linkage/cxx_runtime足够表达需求,可以完善现有机制并明确文档,避免重复配置。若需要直接表达 CRT 选择,可考虑沿用现有 ABI 配置位置,例如:
是否支持 debug CRT 可以分阶段决定;当前项目的直接需求是普通 clang++ 下显式选择动态 release CRT。
两个维度的预期映射:
debug = true表示调试信息需求,不应自动等价于 debug CRT。期望行为
linkage、cxx_runtime及已有默认行为统一解析,记录优先级;对已知矛盾给出明确诊断,不输出互相覆盖的 CRT 参数。建议验证
import std;的最小程序能够编译链接,TU 与标准库 BMI 使用一致配置。不要求本 issue 一次实现所有配置维度,但希望先有受支持的方式,让 LLVM/clang++ 行显式选择动态 release CRT,并让 std BMI、缓存及运行库记录保持一致。