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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:15:33