CMake 3.26.0-rc2使用target_sources添加CXX_MODULES报错求助
问题
使用CMake 3.26.0-rc2 + GCC 12.2.0配置C++20模块示例时,执行CMake配置报出错误:
CMake Error at CMakeLists.txt:20 (target_sources):
target_sources File set TYPE may only be "HEADERS"
示例的CMakeLists.txt代码如下:
cmake_minimum_required(VERSION 3.23) project(std_module_example CXX) set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "3c375311-a3c9-4396-a187-3227ef642046") if(WIN32) include(msvc_modules.cmake) else() include(gcc_modules.cmake) endif() set(CMAKE_CXX_STANDARD 20) add_library(std_module_example) target_link_libraries(std_module_example) target_sources(std_module_example PRIVATE t4.cxx PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES t1.cxx t2.cxx t3.cxx ) add_executable(main main.cxx) target_link_libraries(main std_module_example)
解决方案
原因
CMake 3.26.0-rc2的target_sources命令中,FILE_SET仅支持HEADERS类型,CXX_MODULES类型的FILE_SET是在后续版本(3.28+)才正式引入并支持的。你使用的示例代码是针对更新版本的CMake编写的,因此出现兼容性错误。
修复步骤
修改
target_sources写法
移除FILE_SET相关代码,改用实验性的模块源文件声明方式,结合示例中的gcc_modules.cmake脚本,将target_sources部分替换为:target_sources(std_module_example PRIVATE t4.cxx PUBLIC t1.cxx t2.cxx t3.cxx )同时确保
gcc_modules.cmake脚本中包含了针对GCC编译C++模块的必要逻辑(比如设置-fmodules-ts编译选项、处理模块依赖等)。升级CMake版本(推荐)
如果环境允许,将CMake升级到3.28或更高版本,这些版本正式支持CXX_MODULES类型的FILE_SET,可以直接使用示例中的原始代码而无需修改。
内容的提问来源于stack exchange,提问作者sunshine
相关产品推荐
相关产品推荐

