M1 Mac用CMake+G++构建C++20模块报错:生成器不支持模块源文件
问题修复:CMake + G++ 在M1 Mac上构建C++20模块失败
你遇到的错误核心原因是Unix Makefiles生成器暂不支持CMake的实验性C++模块功能,同时你的CMake配置存在重复设置、未定义变量等问题,以下是具体修复步骤:
1. 切换到Ninja生成器
CMake的实验性C++模块实现对Ninja生成器的支持更完善,Unix Makefiles目前未适配该功能:
- 安装Ninja(M1 Mac通过Homebrew):
brew install ninja - 重新配置时指定Ninja生成器(确保使用Homebrew安装的G++,避免系统clang伪装的
g++):cmake -S . -B build -G Ninja -DCMAKE_CXX_COMPILER=/opt/homebrew/bin/g++-12
2. 修正CMakeLists.txt配置
以下是修复后的完整配置,解决了重复设置、未定义变量等问题:
cmake_minimum_required(VERSION 3.25) project(TryingModules CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 对应CMake 3.25的实验性C++模块API标识 set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "3c375311-a3c9-4396-a187-3227ef642046") # 启用动态依赖扫描 set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1) # 配置G++的模块依赖扫描命令 string(CONCAT CMAKE_EXPERIMENTAL_CXX_SCANDEP_SOURCE "<CMAKE_CXX_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -E -x c++ <SOURCE>" " -MT <DYNDEP_FILE> -MD -MF <DEP_FILE>" " -fmodules-ts -fdep-file=<DYNDEP_FILE> -fdep-output=<OBJECT> -fdep-format=trtbd" " -o <PREPROCESSED_SOURCE>") # G++模块映射相关配置 set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FORMAT "g++") set(CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FLAG "-fmodules-ts -fmodule-mapper=<MODULE_MAP_FILE> -fdep-format=trtbd -x c++") # 全局启用C++模块TS set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmodules-ts") add_library(TryingModules) target_sources(TryingModules PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES moduleTest.cpp ) add_executable(main main.cpp) target_link_libraries(main PRIVATE TryingModules)
配置修正点:
- 移除重复的
CMAKE_EXPERIMENTAL_CXX_MODULE_MAP_FORMAT设置 - 删除未定义的
compiler_flags_for_module_map变量引用 - 启用
CMAKE_CXX_STANDARD_REQUIRED和CMAKE_CXX_EXTENSIONS OFF确保严格遵循C++20标准 - 清理
target_link_libraries的冗余参数
3. 验证G++版本兼容性
C20模块(TS)需要G 11及以上版本,执行以下命令确认版本:
g++ --version
版本过低则通过Homebrew更新:
brew install gcc
4. 执行构建
配置完成后进入build目录执行构建:
cd build cmake --build . ./main
内容的提问来源于stack exchange,提问作者Amory Acosta
相关产品推荐
相关产品推荐

