如何用Python交叉编译带有C代码的三方库
我想往一个 arm linux 上面跑 Python 程序,交叉编译 Python 时就缺过很多像 zlib、openssl 这种库,下载源码修改 gcc、g++这些地址后就能编译进去了。 后来装 Python 库,绝大多数纯 Python 代码复制粘贴也可以了,现在想装 gevent,库里有几个 so 的文件是平台相关的,我觉得应该可以通过 python setup.py build 来编译然后复制过去,找不到从哪改编译器设置了。
如何用Python交叉编译带有C代码的三方库
1.rootfs 搞成 debian 的就不会有这些问题。
2.如果你硬是要编。。。
export CC=
export LDSHARED=
export CFLAGS=
export LDFLAGS=
export CROSSBASE= //rootfs 路径,连接动态库。
python setup.py build
python bdist_egg
要交叉编译带C扩展的Python库,得用crossenv配合cross-python。这里以在x86_64主机上编译ARM64库为例:
# 1. 安装交叉编译环境
pip install crossenv
# 2. 创建交叉编译虚拟环境
crossenv ~/cross-venv --target=aarch64-linux-gnu
# 3. 激活环境并安装交叉编译的Python
source ~/cross-venv/bin/activate
pip install cross-python-aarch64
# 4. 设置交叉编译参数
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export AR=aarch64-linux-gnu-ar
export RANLIB=aarch64-linux-gnu-ranlib
# 5. 编译带C扩展的库(以numpy为例)
cd /tmp
git clone https://github.com/numpy/numpy.git
cd numpy
python setup.py build --cross-compile
python setup.py bdist_wheel --plat-name=manylinux2014_aarch64
# 6. 验证生成的wheel文件
file dist/*.whl
关键点:
crossenv创建隔离的交叉编译环境cross-python-*提供目标架构的Python头文件和库- 环境变量设置正确的交叉编译工具链
--cross-compile参数告诉setup.py这是交叉编译--plat-name指定目标平台标签
如果库有复杂的构建系统,可能需要在setup.py中添加交叉编译支持:
# setup.py示例
from setuptools import setup, Extension
import sys
is_cross = hasattr(sys, 'cross_compile')
ext_modules = [
Extension(
'mylib._core',
sources=['src/core.c'],
define_macros=[('CROSS_COMPILE', '1')] if is_cross else []
)
]
setup(
name='mylib',
ext_modules=ext_modules,
options={'build_ext': {'cross_compile': is_cross}}
)
用docker会更简单:docker run --rm -v $(pwd):/io quay.io/pypa/manylinux2014_aarch64 bash -c "pip install numpy && python -c 'import numpy; print(numpy.__version__)'"
总结:交叉编译C扩展库主要靠正确的工具链和环境隔离。
我想了五分钟,你好像不知道 CC 环境变量是干什么的,别折磨自己了
身边没人弄过这个,只能自己来了。其他需要的库我改改 Makefile 都编译了,程序都跑起来了,这是最后一个。
python setup.py build 会报错,我手动编译这个依赖库会提示 C 编译器错误,换成本机的 gcc-4.8 可以运行,不过就是 x86 版本的了。<br>rootubuntu:~/gevent-1.2.2/deps/libev# ./configure CC=arm-linux-gnueabihf-gcc --prefix=`pwd`/mylib <br>checking for a BSD-compatible install... /usr/bin/install -c<br>checking whether build environment is sane... yes<br>checking for a thread-safe mkdir -p... /bin/mkdir -p<br>checking for gawk... no<br>checking for mawk... mawk<br>checking whether make sets $(MAKE)... yes<br>checking whether make supports nested variables... yes<br>checking whether to enable maintainer-specific portions of Makefiles... no<br>checking for gcc... arm-linux-gnueabihf-gcc<br>checking whether the C compiler works... no<br>configure: error: in `/root/gevent-1.2.2/deps/libev':<br>configure: error: C compiler cannot create executables<br>See `config.log' for more details<br>
我想着树莓派也是 armv7l,把树莓派上的拷过去也许可以,结果提示缺少_corecffi.so
在 https://anaconda.org/search?q=gevent 上面搜到的 gevent 包也是没有这个文件
瞎鼓捣勉强能用了。
export CC=“arm-linux-gnueabihf-gcc -pthread"
export LDSHARED=”${CC} -shared"
export CROSSBASE=/root/rootfs/rootfs
先加了这三条,其他不知道填啥了。
然后 python setup.py build 报错,进入 deps/libev 目录,./configure 提示需要加–host 参数。
修改_setuplibev.py,_setupares.py ,找到 sh ./configure 所在行,在后面加上–host=arm-linux-gnueabihf
继续 python setup.py build,可能是配置不对需要将 corecext.cpython-36m-i386-linux-gnu.so 重命名,改成 corecext.so ,然后复制到 arm 系统内就可以用了。
我看到有提到用 buildroot 之类的工具,似乎是能直接构建?
楼主这个问题解决没有。遇到一样的问题了。快折磨死了

