QtCreator中C++20编译std::atomic<A>提示无is_always_lock_free成员问题
问题分析与解决
为啥会这样?
QtCreator默认的构建配置(不管是qmake还是CMake)开启C20时,可能没完全对齐系统clang的标准支持参数,或者遗漏了必要的编译定义,导致std::atomic<T>的静态成员is_always_lock_free没被正确识别。而终端直接执行clang++时,会使用默认的完整C20支持参数,所以编译正常。
怎么解决?
1. 检查QtCreator的C++标准配置
- 打开QtCreator的「项目」面板,找到当前构建套件的「编译器设置」
- 确认C++标准设为
C++20(别选C++20 (gnu++20)这类带扩展的变体,部分场景下扩展变体可能影响标准库的成员暴露) - 如果是qmake项目,直接在
.pro文件里明确指定:
不要混合使用CONFIG += c++20 QMAKE_CXXFLAGS += -std=c++20gnu++20,确保用纯标准的c++20
2. 确认QtCreator使用的clang与终端一致
- 进入QtCreator的「工具>选项>构建和运行>编译器」,查看当前使用的clang路径,和终端执行
which clang++的结果对比 - 如果路径不同,说明QtCreator用的是Qt自带的clang而非系统clang,切换为系统clang即可:
- 添加新编译器,选择系统路径下的
clang++(通常是/usr/bin/clang++) - 将该编译器设为当前构建套件的默认C++编译器
- 添加新编译器,选择系统路径下的
3. qmake项目补充编译宏
要是上面的步骤无效,在.pro文件里加一行:
DEFINES += _LIBCPP_ENABLE_CXX20_REMOVED_ATOMIC_MEMBERS
这个宏用于让MacOS默认的libc标准库正确暴露C20中std::atomic的相关静态成员,部分旧版本的QtCreator配置默认没启用它。
4. CMake项目调整配置
如果是CMake项目,在CMakeLists.txt里确保配置如下:
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 禁用GNU扩展,使用纯C++标准
同时检查CMake的构建工具链是否指向系统clang,而非Qt自带的工具链。
验证方法
修改配置后,重新执行qmake/CMake,清理构建目录再重新编译,确认错误是否消失。
内容的提问来源于stack exchange,提问作者HarryP2023
相关产品推荐
相关产品推荐

