You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# CMake构建时同名XAML文件冲突报错问题问询

该现象是否为正常预期

这个现象不属于CMake的设计预期,是默认配置下C#项目中间目录规则和C项目不一致导致的。
CMake处理C
项目时默认会为每个目标自动分配独立的<目标名>.dir中间目录,避免同名文件冲突;但处理C#项目时默认没有做这个隔离,所有目标的XAML自动生成代码、编译中间产物都会输出到同一个全局obj目录下,同名的.xaml文件生成的.g/.g.cs文件会互相覆盖,就触发了你遇到的编译报错。

可用解决方法
  • 为每个C#目标单独指定独立的中间输出目录,在add_library/add_executable定义目标后,设置VS_INTERMEDIATE_TARGET_DIR属性即可:
add_library(One SHARED ${One_SRCS})
set_target_properties(One PROPERTIES
    VS_INTERMEDIATE_TARGET_DIR "${CMAKE_BINARY_DIR}/obj/${CMAKE_VS_PLATFORM_NAME}/$<CONFIG>/One.dir"
)

add_library(Two SHARED ${Two_SRCS})
set_target_properties(Two PROPERTIES
    VS_INTERMEDIATE_TARGET_DIR "${CMAKE_BINARY_DIR}/obj/${CMAKE_VS_PLATFORM_NAME}/$<CONFIG>/Two.dir"
)

这里使用$<CONFIG>生成器表达式适配Visual Studio多配置生成器的Debug/Release等不同构建配置,无需手动指定构建类型。

  • 如果需要迁移的项目数量较多,可以封装通用函数简化配置:
function(config_csharp_intermediate_dir TARGET)
    set_target_properties(${TARGET} PROPERTIES
        VS_INTERMEDIATE_TARGET_DIR "${CMAKE_BINARY_DIR}/obj/${CMAKE_VS_PLATFORM_NAME}/$<CONFIG>/${TARGET}.dir"
        VS_GLOBAL_IntermediateOutputPath "${CMAKE_BINARY_DIR}/obj/${CMAKE_VS_PLATFORM_NAME}/$<CONFIG>/${TARGET}.dir"
    )
endfunction()

# 每个C#目标调用一次即可
config_csharp_intermediate_dir(One)
config_csharp_intermediate_dir(Two)
  • 配置完成后重新生成VS解决方案,打开项目属性页确认「中间输出路径」已经指向各目标独立的目录,即可解决文件覆盖冲突问题,无需每次构建前手动删除obj目录。

内容的提问来源于stack exchange,提问作者user2690730

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:45:02