返回顶部
首页 > 资讯 > 后端开发 > Python >如何交叉编译Python到ARM-Lin
  • 861
分享到

如何交叉编译Python到ARM-Lin

PythonARMLin 2023-01-31 02:01:39 861人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

前言 我需要在Arm9的s3c2410 CPU上运行python,以下是我的编译过程。 host编译环境: ubuntu 7.04, GCc 4.2.1, arm-linux-gcc 3.3.2 要cross compil

前言

我需要在Arm9的s3c2410 CPU上运行python,以下是我的编译过程。

host编译环境:

ubuntu 7.04, GCc 4.2.1, arm-linux-gcc 3.3.2

要cross compile的程序:

编译sqlite

先去 Http://www.sqlite.org/download.html 下载最新的sqlite源代码,我这里用的是3.5.6版本的。

我推荐使用amalgamation版本的源代码,这个代码只有几个文件而已,编译起来方便,而且据说 编译器好的话,还可能编译出更高效的代码。 我下载的是

http://www.sqlite.org/sqlite-amalgamation-3.5.6.tar.gz

先运行以下几步:

tar zxf sqlite-amalgamation-3.5.6.tar.gz
cd sqlite-3.5.6
./configure --host=arm-linux --prefix=/usr/local/arm/3.3.2 --enable-shared --disable-readline --disable-dynamic-extensions

以上是把sqlite解压缩,然后做一些配置,这里,我希望sqlite到时候安装到/usr/local/arm/3.3.2里,要生成动态链接库,不要readline,不要sqlite的动态扩展。

然后编辑Makefile,把CFLAG和CXXFLAG中的-g去掉,我们不用debug sqlite。

接下来就可以编译和安装sqlite了:

make
make install


这一步就完成了sqlite的编译和安装了。

编译python

先去http://www.python.org/download/下载最新版本的python源代码,我这里下载的是:

http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tar.bz2

先把python解压缩:

tar jxf Python-2.5.1.tar.bz2
cd Python-2.5.1

编译pc版本的语法解析器

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:

mkdir build.pc
cd build.pc
../configure
make Parser/pgen

然后ls Parser一下,应该就能看到有pgen了。

修改configure

configure在检测编译器的printf是否支持%zd的时候,如果发现是在cross compile,就直接不干活了。这还了得?

把这一部分的检测代码去掉。这段代码起始于

echo "$as_me:$LINENO: checking for %zd printf() fORMat support" >&5
echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6
if test "$cross_compiling" = yes; then

结束于
cat >>confdefs.h <<\_ACEOF
#define PY_FORMAT_SIZE_T "z"
_ACEOF

else
  echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

( exit $ac_status )
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi

把这两段以及中间的内容都删除掉就可以了。

编译arm版本的python

有了语法解析器,就可以开始编译arm版本的python了。

mkdir ../build.arm
cd ../build.arm
../configure --prefix=/home/leojay/test/arm-system-working/rootfs --disable-ipv6 --host=arm-linux --enable-shared

先创建一个用于编译的目录build.arm,再对python做一些配置,如安装目录,不要ipv6,使用arm-linux的编译器,生成动态链接库。

修改Makefile

之后就要对Makefile做一些修改,把

OPT=            -DNDEBUG -g -O3 -Wall -Wstrict-prototypes

一行中,去掉-g,我们不要debug python,-O3改为-O2,空间紧张O2就可以了。

PGEN=           Parser/pgen$(EXE)

一行的下面加上

PGEN_HOST=      ../build.pc/Parser/pgen$(EXE)

表明我们在HOST上运行的pgen

在要使用PGEN的地方改为PGEN_HOST:

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
                -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改为:

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
                -$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

修改所有使用新生成的python的地方。

所有如 ./$(BUILDPYTHON) 的地方,都改为python

如:

platform: $(BUILDPYTHON)
        $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

改为

platform: $(BUILDPYTHON)
        $(RUNSHARED)  python  -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

这种地方比较多,大家小心修改。

修改setup.py

setup.py负责编译python的各个扩展模块。但是,由于python完全没有考虑cross compile,所以要做一些修改。

  • PyBuildExt类:

    1. build_extension函数:
      • 这个函数在编译了所有的extension后,会去load这些刚编译好的extension, 但我们在i686的电脑上显然不能load,所以要跳过这些操作。 在 build_ext.build_extension(self, ext)后面直接写一个return,不做load。
    2. detect_modules函数:
      • 函数的前两行是把/usr/local加到搜索目录中,我们的cross compiler一般不会直接安装在 /usr/local里面的,所以这两行去掉:
      • add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
        add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
      • lib_dirs, inc_dirs的设定中,把中括号里的那些都去掉。 以下所有模块都不要:
    3. cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,
    4. ssl, openssl, bdb, dbm, termiOS, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter
      由于python本身的问题,现在ctypes还不能在除i386以外的机器上运行,所以ctypes也去掉 编译sqlite的地方:
    5. for d in inc_dirs + sqlite_inc_paths:
      改为:
    6. for d in ['/usr/local/arm/3.3.2/include']

           因为我的sqlite3安装在这里,如果这里不改的话,setup.py会在我的电脑上找sqlite          

  • main函数:
    • setup函数调用的时候,把要安装的scripts那一部分去掉

之后就可以make && make install了。

附上我修改后的 Makefile 和 setup.py 供大家参考

裁减python

python完全安装后,实在是很大,所以,要把一些肯定用不上的库去掉。 所以,再附上我的裁减脚本 cleanpy.sh

注意,由于我的python程序都运行在python -OO的参数下,所有的.py和.pyc都不需要, 只要有.pyo就可以了。所以,这个脚本会把所有的.py和.pyc都删除掉。

大家可以根据自己的需要做调整。

关于如何生成所有库的.pyo文件,可以参考我的这篇文章: http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage


备注:

请尊重原创作者的劳动成果,转摘请注明出处:http://wiki.woodpecker.org.cn/moin/LeoJay/HOWTOCrossCompilePythonForARM


--结束END--

本文标题: 如何交叉编译Python到ARM-Lin

本文链接: https://lsjlt.com/news/187102.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何交叉编译Python到ARM-Lin
    前言 我需要在Arm9的s3c2410 CPU上运行python,以下是我的编译过程。 host编译环境: ubuntu 7.04, gcc 4.2.1, arm-linux-gcc 3.3.2 要cross compil...
    99+
    2023-01-31
    Python ARM Lin
  • linux如何配置arm交叉编译器
    要配置ARM交叉编译器,可以按照以下步骤进行操作:1. 安装ARM交叉编译器工具链:ARM交叉编译器工具链是专门用于ARM架构的编译...
    99+
    2023-08-11
    linux
  • ubuntu如何交叉编译环境
    12ubuntu交叉编译环境的搭建示例:打开终端命令行。输入以下命令安装交叉编译环境。sudo apt-get install gcc g++ libcc1 libg++ make gdb再输入以下命令安装交叉编译器。wget ftp://...
    99+
    2024-04-02
  • redis交叉编译 (windows( x86 x86_64) & linux(arm aarch64 armv8l)) 成品
    redis交叉编译 平台: Windows: x86 x86_64 Linux: arm aarch64 armv8l 仓库地址: https://github.com/huskar-t/redis 成品地址 github...
    99+
    2018-05-17
    redis交叉编译 (windows( x86 x86_64) & linux(arm aarch64 armv8l)) 成品
  • 如何查看ubuntu交叉编译器
    要查看Ubuntu交叉编译器,请按照以下步骤操作:1. 打开终端。2. 运行以下命令来安装交叉编译器:```sudo apt-get...
    99+
    2023-08-26
    ubuntu
  • Fedora SkyEye如何安装交叉编译器
    这篇文章给大家分享的是有关Fedora SkyEye如何安装交叉编译器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Fedora SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具,这样就可以在没有硬件条件下...
    99+
    2023-06-16
  • ubuntu交叉编译工具如何安装
    要安装Ubuntu的交叉编译工具,您可以按照以下步骤进行操作:1. 打开终端窗口。2. 更新软件包列表,运行以下命令:sudo ap...
    99+
    2023-09-20
    ubuntu
  • linux交叉编译环境如何搭建
    搭建Linux交叉编译环境需要以下步骤:1. 安装交叉编译工具链:交叉编译工具链是为了在一种操作系统上生成另一种操作系统的可执行文件。可以通过以下几种方式安装交叉编译工具链:- 使用发行版提供的交叉编译工具链:有些Linux发行版提供了...
    99+
    2023-08-11
    linux
  • C++中protobuf的交叉编译如何使用
    这篇文章主要介绍“C++中protobuf的交叉编译如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++中protobuf的交叉编译如何使用”文章能帮助大家解决问题。简介官方文档给出的定义和...
    99+
    2023-07-02
  • cocos2d-2.0-x-2.0.3 交叉编译到android报错解决
    我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也没成功 今天来了下载了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本问题还是哪一步出...
    99+
    2022-06-06
    cocos2d cocos 交叉编译 交叉 Android
  • 关于python中第三方库交叉编译的问题
    目录一、前言:二、交叉编译介绍:三、python及其第三方库的交叉编译背景四、交叉编译的准备工作五、交叉编译python及其第三方的思路六、准备交叉编译工具七、准备openssl-b...
    99+
    2024-04-02
  • ubuntu如何编译python
    ubuntu编译python的方法:进入ubuntu系统后,使用“Ctrl+Alt+T”打开命令行终端。在命令行中,使用cd指令将当前文件路径切换到python文件的目录下。在输入“vim 文件名.py”打开需要编辑的python文件,按下...
    99+
    2024-04-02
  • 如何解决nginx中rtmp模块编译arm版本的问题
    这篇文章主要为大家展示了“如何解决nginx中rtmp模块编译arm版本的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决nginx中rtmp模块编译arm版本的问题”这篇文章吧。一、...
    99+
    2023-06-22
  • idea编译找不到类如何解决
    如果在编译过程中找不到类,可能是由于以下几个原因:1. 类路径问题:请确保编译时使用的类路径包含了所需要的类。可以通过检查编译命令或...
    99+
    2023-10-20
    idea
  • 如何借助关键字 JOIN 编写 MySQL 交叉连接查询?
    交叉连接的MySQL查询也可以借助关键字JOIN来编写。为了理解它,我们以名为 tbl_1 和 tbl_2 的两个表为例,它们具有以下数据:mysql> Select * from tbl_1; +----+--------...
    99+
    2023-10-22
  • javac编译找不到文件如何解决
    这篇文章主要讲解了“javac编译找不到文件如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javac编译找不到文件如何解决”吧!javac编译找不到文件怎么办:通过”cd“命令切换到...
    99+
    2023-07-01
  • Linux模块文件如何编译到内核和独立编译成模块
    这篇文章主要介绍“Linux模块文件如何编译到内核和独立编译成模块”,在日常操作中,相信很多人在Linux模块文件如何编译到内核和独立编译成模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux模块文件...
    99+
    2023-06-15
  • 如何将Python编译成C语言
    前言: 文章里用的Python环境是Anaconda3 2019.7这里测试的程序是找出所有1000以内的勾股数。a∈[1, 1000],b∈[1, 1000],...
    99+
    2024-04-02
  • vscode编译找不到头文件如何解决
    如果在使用VSCode编译时找不到头文件,可以尝试以下几种解决方法: 确保头文件所在的路径已正确添加到编译器的搜索路径中。在VS...
    99+
    2023-10-23
    vscode
  • java编译时找不到符号如何解决
    在Java编译过程中找不到符号的错误通常是由以下原因引起的:1. 符号拼写错误:检查代码中使用的变量、方法或类是否正确拼写。Java...
    99+
    2023-08-20
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作