编译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
相关产品推荐
相关产品推荐

