You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译Marian NMT失败:代码与C++20兼容性问题求助

解决Marian NMT编译时C++20兼容性错误

问题根源

报错来自项目内嵌的spdlog第三方库,其旧版构造函数写法在C20标准下被判定为非法,且编译时-Werror参数将警告直接转为错误。尽管项目CMakeLists.txt设置了CMAKE_CXX_STANDARD 11,但编译器可能默认启用了更高版本的C标准,或第三方模块未继承该标准配置。

解决方案

方案1:强制指定C++11并禁用特定警告

清理之前的CMake缓存后,执行cmake时添加参数强制使用C++11,同时关闭触发错误的警告:

cd marian/build
rm -rf ./*
cmake .. -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_FLAGS="-Wno-template-id-cdtor"
make -j4

方案2:严格强制C++11标准

如果方案1无效,尝试让CMake严格限制C++标准,避免编译器自动 fallback 到更高版本:

cd marian/build
rm -rf ./*
cmake .. -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=OFF
make -j4

方案3:手动修复spdlog源码(仅前两个方案失效时使用)

找到报错文件src/3rd_party/spdlog/details/registry.h,修改第138、139行:
原代码:

registry_t<Mutex>() {}
registry_t<Mutex>(const registry_t<Mutex>&) = delete;

修改为:

registry_t() {}
registry_t(const registry_t&) = delete;

修改完成后重新执行make -j4

内容的提问来源于stack exchange,提问作者Archnim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:15:05