根本原因是模块接口单元(.ixx)未被CMake识别为源文件,导致Clang未生成.pcm文件;需显式启用模块支持、指定缓存路径、正确声明库类型并避免与GCC标准库模块误用。
import 在 Clang 17 + CMake 3.28 下仍报错 “module file not found”根本原因不是语法写错,而是模块接口单元(.ixx)没被 CMake 正确识别为模块源,导致编译器根本没生成 .pcm 文件。Clang 默认不自动扫描 .ixx,必须显式启用模块支持并指定输出路径。
CMakeLists.txt 中启用 set(CMAKE_CXX_STANDARD 23) 且 set(CMAKE_CXX_STANDARD_REQUIRED ON)
target_compile_options(${tgt} PRIVATE -fmodules -fimplicit-modules -fimplicit-module-maps)(Clang)或 /experimental:module /module:interface(MSVC)source_group("Modules" FILES math.ixx) 显式加入构建,否则 CMake 会跳过它.pcm 输出目录可写,建议统一设为 ${CMAKE_BINARY_DIR}/modules 并用 -fmodules-cache-path=... 指定add_library(... MODULE) 和传统静态库冲突吗会冲突,但不是命名冲突,而是链接语义冲突:MODULE 在 CMake 里特指“动态加载模块”(如插件),和 C++23 Modules 完全无关。误用会导致链接失败或运行时 dlopen 错误。
add_library(math INTERFACE) 或 add_library(math STATIC),再通过 target_sources(math PRIVATE math.ixx) 注入模块文件INTERFACE 库适合纯接口模块(无实现),STATIC 适合含 module implementation partition 的场景target_compile_features(math PUBLIC cxx_modules),否则 CMake 不会向编译器传递模块相关 flagtarget_link_libraries(consumer PRIVATE math),CMake 会自动处理 .pcm 依赖顺序import std.core; 而不报 “no module map for ‘std.core’”GCC 13 对标准库模块支持极弱,std.core 等模块名是 Clang/MSVC 的非标准扩展,GCC 官方尚未实现任何 std.* 模块。强行启用只会触发未定义行为。
import std.core;,改用传统头文件包含(#include )或 GCC 实验性模块:先运行 g++-13 --preprocess -fmodules-ts stdc++.h 生成 stdc++.gcm,再 import "stdc++.gcm";
__cpp_modules 宏值:GCC 13 返回 201907L(仅支持 TS),Clang 17 返回 202507L(支持标准化语法)module.modulemap)在 GCC 下无效,不要尝试手写make clean 不再删除 .pcm 文件因为 CMake 默认不把 .pcm 当作可清理产物——它被归类为“编译器缓存”,而非构建目标。CMake 的 clean 只清理 add_executable/add_library 生成的文件。
CMakeLists.txt 末尾添加:add_custom_target(clean_modules
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/modules
COMMENT "Cleaning module cache"
)add_dependencies(clean clean_modules)
configure_file() 中注入 build clean_modules: phony 到 build.ninja
.pcm 会显著拖慢增量构建,建议只在 CI 或调试模块依赖时启用
import 就变成编译器静默忽略的注释。