摘要
项目需要,要在嵌入式板子上移植python,预期需要的第三方库为numpy、pandas和pymodbus及其依赖库。记录踩坑过程。
主机为32位ubuntu
目标板为32位arm板子,
交叉编译工具链为arm-linux-gnueabihf-
readelf -h 文件名 查看文件的使用架构
坑
- 嵌入式的第三方库无法使用pip install 安装
- 如果需要使用pip instal的话还需要_ctype和zlib
- numpy需要_ctypes
- pymodbus需要_ssl和zlib
- pandas需要_bz2
- 需要使用主机版pyhon的解释器,才能对目标板python的setup进行解释
准备
python3.7源码:、numpy源码:、pandas源码:、pymodbus源码:、six源码:、serial源码:、opsenssl源码:、bzip2源码:
大致流程
编译主机依赖库,编译主机python,编译目标板python,打包至目标板,编译目标板第三方库
注:所有操作在root账户下进行
sudo -i 进入root
编译依赖库
openssl for _ssl
主机openssl编译
openssl参考
参考上文,设置编译位置为/opt/hostssl
cd 源码路径
export CC=
./configure --prefix=/opt/hostssl
make
make install
mv /usr/bin/openssl /usr/bin/openssl.old //将旧版本的openssl进行备份
ln -s /usr/local/bin/openssl /usr/bin/openssl //将新版本的openssl进行软链接
openssl version
OpenSSL 1.1.1q 5 Jul 2022
如果提示找不到动态库,做如下操作
export LD_LIBRARY_PATH=/opt/hostssl/lib:$LD_LIBRARY_PATH #添加库路径
echo $LD_LIBRARY_PATH #查看库路径
目标板openssl编译
openssl参考
参考上文,编译位置选择:–prefix=/opt/ssl
cd 源码路径
make clean
mkdir /opt/ssl
./config no-asm -shared --prefix=/opt/ssl \
CC=arm-linux-gnueabihf-gcc \
CXX=arm-linux-gnueabihf-g++ \
AR=arm-linux-gnueabihf-ar \
RANLIB=arm-linux-gnueabihf-ranlib
修改makefile文件
搜索 m32 选项并删除,共两处(如是64位系统则是m64)
如不删除则编译时会出现以下错误
error: unrecognized command line option '-m32'
修改完成后
make
make install
libbz2 for _bz2
libbz2的编译
py3.7 for arm 仓库
该仓库中的libbz2.so.1.0.6和libbz2.1.0和_bz2.cpython-37m-arm-linux-gnueabihf.so可以直接使用之后再说这一步
zlib
主机板zlib编译
unzip zlib-master.zip
cd zlib-master
export CC=gcc
./con