Linux服务器安装SCIP OptSuite 7.0.3时Bliss编译失败
解决SCIP OptSuite 7.0.3与Bliss 0.77的编译兼容问题
问题根源
SCIP OptSuite 7.0.3的compute_symmetry_bliss.cpp中使用的Bliss回调函数签名(包含void*用户数据参数)与Bliss 0.77的API不兼容。Bliss 0.77对find_automorphisms方法的回调接口做了修改:移除了原有的void*自定义参数,改用std::function通过捕获上下文传递数据,导致SCIP的旧代码无法完成类型转换,触发编译错误。
解决方案
方案1:降级Bliss到兼容版本
SCIP OptSuite 7.0.3适配Bliss 0.73版本,操作步骤如下:
- 卸载当前Bliss 0.77:
sudo rm -rf /usr/local/include/bliss /usr/local/lib/libbliss* sudo ldconfig - 下载并编译安装Bliss 0.73:
# 下载Bliss 0.73源码包(可从官方发布渠道获取) tar xzf bliss-0.73.tar.gz cd bliss-0.73 ./configure make sudo make install sudo ldconfig - 重新编译SCIP OptSuite 7.0.3:
cd /opt/scipoptsuite-7.0.3 rm -rf build mkdir build && cd build cmake .. make
方案2:修改SCIP代码适配Bliss 0.77
通过调整回调函数的调用方式,适配Bliss 0.77的API:
- 编辑文件
/opt/scipoptsuite-7.0.3/scip/src/symmetry/compute_symmetry_bliss.cpp - 找到第377行的调用代码:
G.find_automorphisms(stats, blisshook, (void*) &data); - 将其替换为lambda表达式捕获
data,适配新的回调签名:G.find_automorphisms(stats, [&data](unsigned int n, const unsigned int* aut) { blisshook(&data, n, aut); }); - 保存文件后重新编译SCIP OptSuite即可。
内容的提问来源于stack exchange,提问作者Lisa Marie
相关产品推荐
相关产品推荐

