如何解决arm64的交叉编译python包
我在为 arm64 目标编译/链接 python 包时卡住了。编译发生在一个 docker 容器中,该容器由这个 Dockerfile 设置:
FROM ubuntu:20.04
RUN apt clean && apt -y update && apt -y install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu build-essential wget
RUN apt clean && apt -y update && apt -y install libssl-dev libffi-dev gfortran libopenblas-dev liblapack-dev libxml2-dev libxslt-dev zlib1g-dev libncurses5-dev libreadline-dev libgdbm-dev libdb5.3-dev libbz2-dev liblzma-dev libsqlite3-dev tcl-dev tk tk-dev
编译工作正常,但是对于某些包,例如scipy,链接器无法链接所需的库:
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libopenblas.so when searching for -lopenblas
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libopenblas.a when searching for -lopenblas
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lopenblas
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libopenblas.so when searching for -lopenblas
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libopenblas.a when searching for -lopenblas
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: cannot find -lopenblas
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.so when searching for -lm
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libm.a when searching for -lm
/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 when searching for libgcc_s.so.1
这是由于没有提供 arm64 版本的库,而只有链接器无法使用的 x86_64 版本。我失败的是在系统上获取 arm64。
在搜索 stackoverflow 后,我尝试通过将 Dockerfile 更改为以下内容来简单地安装所需的 arm64 版本的库:
FROM ubuntu:20.04
RUN apt clean && apt -y update && apt -y install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu build-essential wget
RUN apt clean && apt -y update && apt -y install libssl-dev libffi-dev gfortran libopenblas-dev liblapack-dev libxml2-dev libxslt-dev zlib1g-dev libncurses5-dev libreadline-dev libgdbm-dev libdb5.3-dev libbz2-dev liblzma-dev libsqlite3-dev tcl-dev tk tk-dev
RUN dpkg --add-architecture arm64
RUN add-apt-repository "deb [arch=arm64] http://ports.ubuntu.com focal main"
RUN add-apt-repository "deb [arch=arm64] http://ports.ubuntu.com focal universe"
RUN add-apt-repository "deb [arch=arm64] http://ports.ubuntu.com focal restricted"
RUN apt clean && apt update && apt -y install libblas3:arm64 liblapack3:arm64
然而,这导致
libblas3:arm64 : Depends: libc6:arm64 (>= 2.17) but it is not going to be installed
liblapack3:arm64 : Depends: libc6:arm64 (>= 2.29) but it is not going to be installed
Depends: libgcc-s1:arm64 (>= 4.0) but it is not going to be installed
Depends: libgfortran5:arm64 (>= 8) but it is not going to be installed
当我手动添加依赖项时,我收到错误消息,指出 arm64 版本破坏了 amd64 版本,反之亦然。
我看到的最后一个选项是获取源代码并自己编译。然而,这似乎是不必要的,因为这些库可用,我就是无法安装它们。有人可以告诉我我一路上错过了什么吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。