使用Mingw-w64(ucrt64)编译mFAST库失败求助
解决mFAST编译时Boost hash_combine模板匹配错误
问题根源
错误核心是mFAST代码对boost::hash_combine的显式实例化与Boost 1.83的模板声明不匹配:
- Boost的
hash_combine模板定义为:template<class T> void boost::hash_combine(std::size_t&, const T&) - mFAST代码中显式实例化时使用
unsigned long&作为第一个参数,而Windows平台上std::size_t等价于unsigned long long,导致类型不匹配。 - 同时你的CMake命令中
BOOST_ROOT设置错误,应指向Boost安装根目录而非头文件子目录。
修复步骤
1. 修正CMake配置的BOOST_ROOT参数
重新执行CMake时,将BOOST_ROOT设置为MSYS64中ucrt64的根目录(而非include/boost子目录):
cmake .. -G "Unix Makefiles" -DBOOST_ROOT="C:\msys64\ucrt64"
CMake的Boost查找模块需要从根目录出发,自动定位头文件、库文件和配置文件,之前的路径会导致CMake无法完整识别Boost的安装结构。
2. 修改mFAST的decimal_ref.cpp代码
打开D:/mFAST/src/mfast/decimal_ref.cpp,调整第24行和第26行的显式实例化代码:
- 将
unsigned long&替换为std::size_t& - 若文件顶部未包含
<cstddef>头文件,需补充添加
修改后的代码片段:
// 第24行 template void boost::hash_combine<boost::multiprecision::backends::cpp_dec_float<18u, int, void>::enum_fpclass_type>(std::size_t&, boost::multiprecision::backends::cpp_dec_float<18u, int, void>::enum_fpclass_type const&); // 第26行 template void boost::hash_combine<bool>(std::size_t&, bool const&);
补充头文件(如果缺失):
#include <cstddef>
3. 可选:降级Boost版本(无需修改代码)
若不想修改mFAST代码,可以安装兼容的旧版本Boost(如1.7x系列):
pacman -R mingw-w64-ucrt-x86_64-boost pacman -S mingw-w64-ucrt-x86_64-boost=1.79.0-1
版本号需根据MSYS2仓库的可用版本调整。
内容的提问来源于stack exchange,提问作者Prabal Kajla
相关产品推荐
相关产品推荐

