QtCreator5 C++11项目调用protoc3.18.0生成代码报mutex.h常量表达式错误
报错根因
这是Protobuf v3.18.0版本的已知C++11兼容问题:
- C++11标准明确要求:被
constexpr修饰的构造函数所属的类,所有非静态成员都必须是字面类型,而std::mutex本身有非平凡析构函数,不属于字面类型,包裹它的google::protobuf::internal::CallOnceInitializedMutex<std::mutex>自然也不是字面类型。 - 该版本的
mutex.h代码错误地给非QNX系统下的WrappedMutex构造函数加上了constexpr修饰,违反了C11的语法规则,Qt Creator 5配套的编译器通常严格遵循C11标准,会直接抛出编译错误。如果使用C++17及更高标准,该限制被放宽,不会触发报错。
修复方案
可根据你的项目情况选择任意一种方案:
- 方案1:升级Protobuf到v3.19.0及以上版本,官方已经在后续版本修复了该兼容问题,移除了非QNX场景下的多余
constexpr修饰。 - 方案2:如果必须保留v3.18.0版本,手动修改
mutex.h的对应代码,将报错行的constexpr修饰删除即可,修改后代码为:WrappedMutex() {}。 - 方案3:如果项目允许升级编译标准,将Qt项目的C编译标准改为C17及以上,即可直接规避该语法检查报错。
- 方案4:如果使用MSVC编译器,可临时添加编译选项
/Zc:relaxedConstexpr-关闭严格的constexpr语法检查,该方案为临时规避手段,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Epsilon Away
相关产品推荐
相关产品推荐

