C++模块文件是否需特定扩展名?CMake跨编译配置报错求助
CMake配置C++模块时自定义扩展名报错的解决与扩展名说明
错误原因解析
你遇到的报错“Target 'myapp' has source file ... in a 'FILE_SET TYPE CXX_MODULES' but it is not scheduled for compilation”,本质是CMake无法识别自定义扩展名.mymodule对应的文件为C++模块源文件。
CMake的CXX_MODULES FILE_SET要求纳入的文件必须是CMake认定的C++模块编译对象,但CMake默认只对特定扩展名的文件启用模块编译逻辑,自定义扩展名不在这个默认列表里,所以CMake不知道要为这个文件执行模块编译流程,就会报出“未安排编译”的错误。
为什么.cppm可以正常工作
.cppm是当前被主流编译器(MSVC、Clang、GCC)和CMake共同认可的C模块接口文件扩展名,CMake内置了对这个扩展名的支持——只要文件用.cppm命名,CMake就会自动将其识别为C模块源文件,无需额外配置,所以跨编译器都能正常编译。
自定义扩展名的解决方法
如果一定要使用.mymodule这类自定义扩展名,需要手动告诉CMake该文件的属性,强制将其当作C++模块编译:
# 先为自定义扩展名的文件设置属性 set_source_files_properties(${PRJT_ROOT}/Engine/DiskStorage/DiskStorageManager.mymodule PROPERTIES LANGUAGE CXX # 指定为C++语言 CXX_STANDARD 20 # 启用C++20及以上标准(模块是C++20特性) CXX_STANDARD_REQUIRED ON ) # 再加入FILE_SET CXX_MODULES target_sources(myapp PUBLIC FILE_SET CXX_MODULES FILES ${PRJT_ROOT}/Engine/DiskStorage/DiskStorageManager.mymodule )
C++模块扩展名的说明
C++标准本身没有强制要求模块文件必须使用特定扩展名,但为了跨工具链和编译器的兼容性,推荐使用行业通用的扩展名:
.cppm:最通用的C++模块接口文件扩展名,MSVC、Clang、GCC均支持.ixx:MSVC早期用于模块接口的扩展名,目前仍兼容.cxxm:部分场景下的替代扩展名,适配部分编译器的命名习惯
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

