本文为原创,转载请注明:http://www.cnblogs.com/tolimit/

编译环境:ubuntu-14.04.1

编译器:gcc、arm-hisiv200-linux-gnueabi

Python版本:2.7.3

整个过程相对简单,分为三个步骤:

  1. 编译X86版本的python
  2. 给python源码打上交叉编译补丁
  3. 交叉编译python

编译X86版本PYTHON

  进入python源码目录,执行:

./configure 

  编译python和Parser/pgen

make python Parser/pgen

  将X86版本的python可执行文件备份为python_for_build

mv python python_for_build 

  将X86版本的pgen可执行文件配备为pgen_for_build

mv Parser/pgen Parser/pgen_for_build 

  清理编译好的项目文件,这一步是为了后面的交叉编译做准备

make distclean

  整个步骤最重要的就是保存好python和pgen这两个可执行文件,因为之后在交叉编译Python时需要用到这两个文件。

给python源码打上交叉编译补丁

  我的python版本是2.7.3,所以补丁也需要打上对应的版本,不同版本的补丁如下:

  

  进入python源码目录,执行

patch -p1 < Python-2.7.-xcompile.patch

  这时显示如下,则表示打补丁成功

交叉编译python

配置

  • CC为指定C交叉编译器,我的是arm-hisiv200-linux-gnueabi-gcc
  • CXX为指定C++交叉编译器,我的是arm-hisiv200-linux-gnueabi-g++
  • AR为ar工具,我的是arm-hisiv200-linux-gnueabi-ar
  • RANLIB为ranlib工具,我的是arm-hisiv200-linux-gnueabi-ranlib
  • Host为目标主机,我这里设置的是arm-hisiv200-linux-gnueabi
  • Build为编译环境主机,我的是x86-linux-gnu
  • Prefix为安装位置

  我的整个配置命令如下:

CC=arm-hisiv200-linux-gnueabi-gcc CXX=arm-hisiv200-linux-gnueabi-g++ AR=arm-hisiv200-linux-gnueabi-ar RANLIB=arm-hisiv200-linux-gnueabi-ranlib ./configure --host=arm-hisiv200-linux-gnueabi --build=x86-linux-gnu --prefix=/home/shanlink/Cross_compile/python-arm/

  这里大家记得把自己机器上对应的参数修改一下

编译

  • HOSTPYTHON指定我们之前编译的X86版本的python文件
  • HOSTPGEN指定我们之前编译的X86版本的pgen文件

  我整个编译命令如下(不同编译器需要修改相应的arm-hisiv200-linux-gnueabi位置):

make HOSTPYTHON=./python_for_build HOSTPGEN=./Parser/pgen_for_build BLDSHARED="arm-hisiv200-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-hisiv200-linux-gnueabi- CROSS_COMPILE_TARGET=yes HOSTARCH=arm-hisiv200-linux-gnueabi BUILDARCH=x86-linux-gnu

安装

  同编译,具体如下:

make install HOSTPYTHON=./python_for_build BLDSHARED="arm-hisiv200-linux-gnueabi-gcc -shared" CROSS_COMPILE=arm-hisiv200-linux-gnueabi- CROSS_COMPILE_TARGET=yes prefix=/home/shanlink/Cross_compile/python-arm

  最后会在prefix指定的目录下有新生成的文件和文件夹,主要文件夹是/bin,/include,/lib,/share。把他们都复制到目标机器的/usr目录下。最后在目标机上执行一下命令可以检查python环境是否完整。

python /usr/lib/python2./test/test___all___.py

错误

按以上方法进行移植时我没有遇到错误,但是之前我按其他方法进行移植时遇到了一下错误,这里记录一下。

  • 编译时遇到过如下错误
#error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG"

编辑pyconfig.h文件,找到#undef PY_FORMAT_LONG_LONG,添加一行#define PY_FORMAT_LONG_LONG “ll”

  • 在目标机器上运行test时遇到如下错误
'import site' failed; use -v for traceback
Traceback (most recent call last): File "test.py", line , in <module> import os ImportError: No module named os

在执行的过程中发现所有的python自带的py/pyc库文件找不到,是由于PYTHONHOME指定的路径有问题,和PYTHONHOME下文件架构有问题,一定为:${PYTHONHOME}/lib/python2.7。一般我们将编译好的文件夹(bin,lib,include,share)直接复制到usr下,是没有这个问题的(PYTHON库会放到/usr/lib/python2.7里面)

移植python笔记的更多相关文章

  1. python笔记41-虚拟环境virtualenv

    前言 如果你是一个python初学者,我是不建议你搞python虚拟环境的,我看到很多python的初学者同学,使用最新版的pycharm,新建一个工程时候默认就是venu虚拟环境. 然后在使用cmd ...

  2. Python笔记之不可不练

    如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...

  3. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  4. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

  5. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  6. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  7. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  8. python笔记 - day8

    python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...

  9. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

随机推荐

  1. Python抓取百度百科数据

    前言 本文整理自慕课网<Python开发简单爬虫>,将会记录爬取百度百科"python"词条相关页面的整个过程. 抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分 ...

  2. IE6支持透明PNG图片解决方案:DD_belatedPNG.js

    DD_belatedPNG.js 是一个能是IE6支持p显示ng透明图片,而且还支持背景循环(background-repeat)和定位(backgrond-position) ,支持focus,Ho ...

  3. [html5] 学习笔记-Canvas标签的使用

    Canvas通过JavaScript来绘制2D图形.Canvas是逐像素渲染的.在Canvas中,一旦图形被绘制完成,它就不会继续得到浏览器的关注.如果其位置发生变化,那么整个场景也需要重新绘制,包括 ...

  4. 软通动力C语言机试题

    #include <stdio.h> int charCount(char *str) { int iCount = 0; int i, j, k=0; char *p = str; ch ...

  5. runloop和runtime

    runloop Runloop是事件接收和分发机制的一个实现. 一个程序从main函数开始,函数执行完毕之后就会退出,iOS程序也是一样的,但是我们从没看到过iOS程序打开之后直接闪退,肯定是有一些东 ...

  6. redis集群原理

    redis是单线程,但是一般的作为缓存使用的话,redis足够了,因为它的读写速度太快了.   官方的一个简单测试: 测试完成了50个并发执行100000个请求. 设置和获取的值是一个256字节字符串 ...

  7. orcale 之 SQL 语言基础

    SQL 全称是结构化查询语句(Structure Query Language),是数据库操作的国际化语言,对所有的数据库产品都要支持. SQL 语言的分类 我们按照其功能可以大致分为四类: 数据定义 ...

  8. Asp.net mvc 知多少(七)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...

  9. 【原创】python中文编码问题深入分析(二):print打印中文异常及显示乱码问题分析与解决

    在学习python以及在使用python进行项目开发的过程中,经常会使用print语句打印一些调试信息,这些调试信息中往往会包含中文,如果你使用python版本是python2.7,或许你也会遇到和我 ...

  10. Dockerfile注意事项

    准则 尽量将Dockerfile放在空目录中,如果目录中必须有其他文件,则使用.dockerignore文件. 避免安装不必须的包. 每个容器应该只关注一个功能点. 最小化镜像的层数. 多行参数时应该 ...