使用Clang交叉编译的Numpy依赖libgcc_s.so.1问题求助
解决Numpy交叉编译依赖libgcc_s.so.1的问题
下面是几个针对性的排查和解决方向,按优先级尝试:
先揪crossenv的工具链配置问题
激活crossenv环境后,先跑echo $CC $CXX $LDSHARED看看这几个核心变量是不是真的指向你的Clang交叉编译工具链——要是指向了GCC,直接手动覆盖:
export CC=你的clang交叉编译器路径(比如arm-linux-gnueabihf-clang) export CXX=对应的clang++路径 export LDSHARED="你的clang路径 -shared"
另外去crossenv生成的环境目录里找sitecustomize.py或者相关配置脚本,看看有没有硬编码指定GCC的逻辑,有的话直接改成Clang的路径。
强制Numpy构建时用Clang,别让它瞎检测
Numpy的构建系统有时候会自己猜编译器,直接给它硬塞参数:
- 安装前先设好全局编译变量,指定目标平台:
比如目标是arm32平台的话,三元组就是export CFLAGS="-target 你的目标平台三元组" export CXXFLAGS="-target 你的目标平台三元组" export LDFLAGS="-target 你的目标平台三元组"arm-linux-gnueabihf。 - 或者直接在pip安装时传编译选项:
pip install numpy --global-option=build_ext --global-option="-cc=你的clang路径" --global-option="-cxx=你的clang++路径" - 还可以写个
site.cfg文件,放在Numpy源码根目录(或者pip安装时用--sitecfg=/path/to/your/site.cfg指定),明确告诉它用Clang:[DEFAULT] compiler = clang
检查你自己编译的目标Python有没有带GCC依赖
别光怪Numpy,先看看你给目标平台做的Python本身是不是依赖libgcc_s.so.1——跑readelf -d /path/to/target/python/bin/python3 | grep NEEDED,要是输出里有libgcc_s.so.1,说明你编译Python的时候没彻底用Clang,得重新编译Python:
CC=你的clang交叉编译器 CXX=对应的clang++ ./configure --host=目标平台三元组 --prefix=安装路径 make && make install
如果目标平台用libc替代libstdc的话,还要加LDFLAGS="-stdlib=libc++"。
让Clang别默认链GCC的库
有些Clang交叉链会默认链接GCC的libstdc++,强制它用自己的libc++:
export CFLAGS="-stdlib=libc++" export CXXFLAGS="-stdlib=libc++" export LDFLAGS="-stdlib=libc++ -lc++abi"
记得目标平台上要提前装好libc和libcabi库。
试试禁用Numpy的外部依赖模块
Numpy里的一些优化模块(比如依赖OpenBLAS的部分)可能会隐式拉GCC的库,先试试不带这些依赖编译,看能不能解决:
export BLAS=None export LAPACK=None pip install numpy
要是没问题,后续再用Clang编译OpenBLAS/LAPACK后重新编译Numpy就行。
内容的提问来源于stack exchange,提问作者Lawrence Kok
相关产品推荐
相关产品推荐

