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
相关产品推荐
相关产品推荐

