Macos flatter(用于快速LLL)本地编译安装(解决安装过程各种疑难杂症)

flatter是一个开源项目,能大大提高LLL的速度,项目提供的安装文档适用于Ubuntu,但是在macos上安装,总会遇到各种各样的问题,这里记录下所踩坑,帮助大家快速在macos上安装flatter。


文章目录

  • 1.安装依赖库(特别注意fplll使用5.4.2版本)
  • 2.修改CMakeLists.txt文件
  • 3.编译


各种报错的解决全部掺杂在小步骤里面了,如果按照步骤来,仍有报错,欢迎在评论区讨论。

1.安装依赖库(特别注意fplll使用5.4.2版本)

正确步骤1:clone flatter项目。

git clone https://github.com/keeganryan/flatter.git

正确步骤2:首先安装如下依赖,这里和项目文档有些出入,这些都是踩坑的教训。

brew install gmp mpfr eigen llvm libomp

正确步骤3:安装fplll的5.4.2版本,参考博客:HomeBrew安装历史版本依赖库(formula)-4.0以后版本通用(以brew安装fplll5.4.2为例)

然后fplll不能直接安装,直接安装的话,默认安装的是新版,新版有不兼容问题,在make的时候会报如下错误:

/opt/homebrew/include/fplll/gso.h:233:16: error: 'fplll::MatGSO<fplll::Z_NR<>, fplll::FP_NR<>>::babai' hides overloaded virtual functions [-Werror,-Woverloaded-virtual]void virtual babai(vector<ZT> &w, const vector<FT> &v, int start = 0, int dimension = -1,^
/opt/homebrew/include/fplll/gso_interface.h:466:16: note: hidden overloaded virtual function 'fplll::MatGSOInterface<fplll::Z_NR<>, fplll::FP_NR<>>::babai' declared here: different number of parameters (3 vs 5)void virtual babai(vector<ZT> &v, int start = 0, int dimension = -1);^
/opt/homebrew/include/fplll/gso_interface.h:477:16: note: hidden overloaded virtual function 'fplll::MatGSOInterface<fplll::Z_NR<>, fplll::FP_NR<>>::babai' declared here: different number of parameters (4 vs 5)void virtual babai(vector<ZT> &w, const vector<FT> &v, int start = 0, int dimension = 1);^
2 errors generated.
make[2]: *** [src/CMakeFiles/flatter.dir/problems/lattice_reduction/fplll_impl.cpp.o] Error 1
make[1]: *** [src/CMakeFiles/flatter.dir/all] Error 2
make: *** [all] Error 2

这个错误的解决办法,就是使用低版本的fplll库,这里使用5.4.2,保证不会有问题。

2.修改CMakeLists.txt文件

安装完依赖后,不能直接cmake,这样的话,会遇到如下的报错:

atfwus@***MacBook-Pro build % cmake ..
CMake Error at /opt/homebrew/Cellar/cmake/3.27.7/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find OpenMP_CXX (missing: OpenMP_CXX_FLAGS OpenMP_CXX_LIB_NAMES)
Call Stack (most recent call first):/opt/homebrew/Cellar/cmake/3.27.7/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)/opt/homebrew/Cellar/cmake/3.27.7/share/cmake/Modules/FindOpenMP.cmake:577 (find_package_handle_standard_args)src/CMakeLists.txt:8 (find_package)

正确步骤4:我们需要在CMakeLists.txt文件中显式指定OpenMP路径:

set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I/opt/homebrew/opt/libomp/include")
set(OpenMP_CXX_LIB_NAMES "omp")
set(OpenMP_omp_LIBRARY "/opt/homebrew/opt/libomp/lib/libomp.a")
set(OpenMP_CXX_VERSION 3.1)

特别注意这几行添加的位置,是位于flatter-main/CMakeLists.txt中的这个位置,添加错位置了也会出问题:
在这里插入图片描述
正确步骤5:然后还需要指定mpfr和gmp的依赖位置:

include_directories(/opt/homebrew/opt/mpfr/include)
include_directories(/opt/homebrew/opt/gmp/include)
link_directories(/opt/homebrew/opt/mpfr/lib)
link_directories(/opt/homebrew/opt/gmp/lib)

如果这里没指定,那么在make的时候会遇到如下的错误:

[ 98%] Building CXX object apps/CMakeFiles/flatter_bin.dir/flatter.cpp.o
In file included from /Users/atfwus/open_proj/flatter-main/apps/flatter.cpp:2:
In file included from /Users/atfwus/open_proj/flatter-main/./include/flatter/data/matrix.h:1:
/Users/atfwus/open_proj/flatter-main/./include/flatter/data/matrix/matrix.h:3:10: fatal error: 'mpfr.h' file not found
#include <mpfr.h>^~~~~~~~
1 error generated.
make[2]: *** [apps/CMakeFiles/flatter_bin.dir/flatter.cpp.o] Error 1
make[1]: *** [apps/CMakeFiles/flatter_bin.dir/all] Error 2

3.编译

正确步骤6:编译

mkdir build && cd ./build
cmake ..
make
sudo make install
sudo update_dyld_shared_cache

如果上面的步骤都做到了的话,这几步都不会出现问题,如果出现了问题,去上面步骤里面找报错信息。

正确步骤7:设置环境变量DYLD_LIBRARY_PATH
进入lib目录,查看当前路径,例如:/Users/atfwus/open_proj/flatter-main/build/lib

编辑~/.zprofile文件(依据你使用的shell不同而不同,有的是.bashrc),将其添加到末尾:

# flatter DYLD
export DYLD_LIBRARY_PATH=/Users/atfwus/open_proj/flatter-main/build/lib:$DYLD_LIBRARY_PATH
source .zprofile

这样就成功安装flatter了,可以检验是否安装成功:

atfwus@xxxMacBook-Pro build % latticegen q 4 2 10 b | flatter
[[4 -1 1 0]
[2 10 8 2]
[1 4 -5 -13]
[4 4 -12 12]
]

如果第7步出现了问题,那么运行上述命令的时候,会有如下报错:

atfwus@xxxMacBook-Pro ~ % flatter
dyld[91789]: Library not loaded: @rpath/libflatter.dylibReferenced from: <945BAD71-AAEC-35CD-AA40-C43693D76181> /usr/local/bin/flatterReason: no LC_RPATH's found
zsh: abort      flatter

ATFWUS 2024-01-18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/414310.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款低成本半桥驱动器集成电路 SIC631CD-T1-GE3

SIC631CD-T1-GE3 是经过优化的集成功率级解决方案用于同步降压应用&#xff0c;提供大电流、高电压效率高&#xff0c;功率密度高。使电压调节器设计能够提供高达50 A的电流每相持续电流。内部功率MOSFET利用Vishay的最先进的第四代TrenchFET技术行业基准绩效将显著降低开关和传…

【Docker】实战多阶段构建 Laravel 镜像:适用于 PHP 开发者阅读

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 本节适用于 PHP 开发者阅读。Laravel 基于 8.x 版本&#xff0c;各个版本的文件结构可能会有差异&#xff0c;请根据实际自行修改。 准备 新…

C# WebApi传参及Postman调试

概述 欢迎来到本文&#xff0c;本篇文章将会探讨C# WebApi中传递参数的方法。在WebApi中&#xff0c;参数传递是一个非常重要的概念&#xff0c;因为它使得我们能够从客户端获取数据&#xff0c;并将数据传递到服务器端进行处理。WebApi是一种使用HTTP协议进行通信的RESTful服…

面试之Glide如何绑定Activity的生命周期

Glide绑定Activity生命周期 Glide.with() 下面都是它的重载方法&#xff0c;Context&#xff0c;Activity&#xff0c;FragmentActivity, Fragment, android.app.Fragment fragment,View都可以作为他的参数&#xff0c;内容大同小异&#xff0c;都是先getRetriever&#xff0…

算法 动态分析 及Java例题讲解

动态规划 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称 DP&#xff09;&#xff0c;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适…

编程和数值计算平台:MATLAB R2023a(Win/Mac)激活版

MATLAB R2023a是一款强大的数值计算和科学编程软件&#xff0c;广泛应用于工程、科学和数学领域。 win版&#xff1a;https://soft.macxf.com/soft/3541.html?idMzE5MTM%3D mac版&#xff1a;https://www.macz.com/mac/9321.html?idOTI2NjQ5Jl8mMjcuMTg2LjkuOTg%3D 以下是MAT…

Jupyter-Notebook无法创建ipynb文件

文章目录 概述排查问题恢复方法参考资料 概述 用户反馈在 Notebook 上无法创建 ipynb 文件&#xff0c;并且会返回以下的错误。 报错的信息是: Unexpected error while saving file: Untitled5.ipynb attempt to write a readonly database 排查问题 这个是一个比较新的问…

动手学深度学习6 自动求导

自动求导 1. 自动求导2. 自动求导实现1. 示例 y 2 X T X y2X^TX y2XTX 关于列向量x求导。2. 非标量变量的反向传播3. 分离计算4. Python控制流的梯度计算 QA 视频&#xff1a; https://www.bilibili.com/video/BV1KA411N7Px/?spm_id_fromautoNext&vd_sourceeb04c9a33e87…

node.js(express.js)+mysql实现登录功能

文章目录 前言实现步骤 实现步骤一、检测登录表单的数据是否合法&#xff08;3&#xff09;新建schema/user.js&#xff08;4&#xff09;在routes/use.js中引入schema/user.js中的方法reg_login_schema&#xff0c;代码如下&#xff1a; 二、根据用户名查询用户的数据三、判断…

触摸按键控制LED灯

目录 1.理论 2.代码 2.1 touch_ctrl_led.v 2.2 tb_touch_ctrl_led 1.理论 以上的波形图的touch_flag是采用组合逻辑的方式产生的。 以上的touch_flag是采用时序逻辑产生的&#xff0c;时序逻辑会延迟一拍。 以上是上升沿和下降沿的组合逻辑和时序逻辑实现&#xff0c;逻辑或…

柏曼、好视力、书客护眼台灯值得入手吗?热门台灯多方位测评对比

近年来学生近视的现象越来越严重了&#xff0c;而且近视的年龄也越来越小了&#xff0c;不少还没开始上小学的孩子&#xff0c;就已经戴上了厚厚的近视眼镜。而那些高年级的学生更是近视的重灾区&#xff0c;每天不仅需要高强度的学习和长时间用眼&#xff0c;甚至晚上都还需要…

27k+ star!有了它 再也不怕忘记linux命令了

简介 linux-command 是一个收集Linux命令的仓库&#xff0c;当前仓库搜集了 580 多个 Linux 命令&#xff0c;是一个非盈利性的仓库&#xff0c;生成了一个 web 网站方便使用&#xff0c;目前网站没有任何广告&#xff0c;内容包含 Linux 命令手册、详解、学习&#xff0c;内容…