当前位置:首页 » 编程软件 » 编译arm版本Python

编译arm版本Python

发布时间: 2023-04-01 06:17:56

❶ 如何交叉编译python到ARM-linux平台

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:
[plain] view plain
mkdir build.pc
cd build.pc
../configure
make Parser/pgen

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

❷ 如何编译可以在Windows下运行的带有Python支持的ARM Linux GDB

距离上次我编译这种GDB的时间转眼过了3年,现在(2017年3月6日),Linaro编译器已经支持python了。不过,当我们自己使用的时候还是有一些麻烦的,因为Linaro编译器的sysroot和平时我们用的sysroot还是不一样的,需要在gdbinit文件里面用"set sysroot"或"set solib-search-path"之类设定路径。生在狮子座长成座的我,是无法容忍这种麻烦的,所以还是自己来弄一次。
还是在Linux下做MinGW的交叉编译,需要MinGW交叉编译器。

因为Linaro已经做了很多事情了,源码,expat,python都搞定了,资源如下:
Linaro GDB git:

从这上面找到与Linaro编译器版本对应的源码
编译用的expat和python:

编译的时候只需要设定一个环境变量:
export PYTHON_MINGW=/home/c/gdb-arm/python-2.7.4-mingw32
然后配置一下就行了:
./configure --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=/home/c/gdb-arm/expat-2.1.0-1 --without-libunwind-ia64 --without-libunwind-ia64 --without-lzma --with-python=/home/c/gdb-arm/python-2.7.4-mingw32 --without-guile --without-babeltrace --with-sysroot=/opt/sysroot-arm
然后就可以:
make
make DESTDIR= install

❸ ubuntu下怎么build一个完整的python

我们需要一个一个编译这些包:
1. common.sh:这个文件里包含一些基础设置,比如选用的GCC,CFLAGS和LDFLAGS如何配置。

[plain] view plain
export NDKDIR="/你的NDK路径比如/android-ndk-r10c"
# GCC 版本选用,目前有4.6,4.8,4.9,选用时也注意Linux系统的类型,这里x86_64是六十四位
export COMPILER="$NDKDIR/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"
export CC="$COMPILER/arm-linux-androideabi-gcc"
export CXX="$COMPILER/arm-linux-androideabi-g++"
export CPP="$COMPILER/arm-linux-androideabi-cpp"
export LD="$COMPILER/arm-linux-androideabi-ld"
export AS="$COMPILER/arm-linux-androideabi-as"
export AR="$COMPILER/arm-linux-androideabi-ar"
export STRIP="$COMPILER/arm-linux-androideabi-strip"
export OBJCOPY="$COMPILER/arm-linux-androideabi-obj"
export OBJDUMP="$COMPILER/arm-linux-androideabi-objmp"
export RANLIB="$COMPILER/arm-linux-androideabi-ranlib"
export NM="$COMPILER/arm-linux-androideabi-nm"
export STRINGS="$COMPILER/arm-linux-androideabi-strings"
export READELF="$COMPILER/arm-linux-androideabi-readelf"

# 选择要编译文件在哪个Android版本上使用,这里案例是在Android 4.2上使用,就是android 17;2.2对应Android 8,5.0对应Android 21
export ANDROID="$NDKDIR/platforms/android-17/arch-arm/usr"
# 配置系统头文件和库文件位置
export CFLAGS="-I$ANDROID/include --sysroot=$ANDROID"
export CXXFLAGS="-I$ANDROID/include --sysroot=$ANDROID"
export CPPFLAGS="-I$ANDROID/include"
export LDFLAGS="-L$ANDROID/lib"

2. 编译openssl:

[plain] view plain
tar zxf openssl-1.0.1j.tar.gz
cd openssl-1.0.1j
mkdir dist

source common.sh
MACHINE=armv7 SYSTEM=android ./config -fPIC --prefix=./dist

# 在Makefile里做一些补丁,以防error
sed -i "s|-m64||" Makefile
sed -i "s|-Wall|-Wall --sysroot=$ANDROID|" Makefile

# 编译并安装
make
make install

3. 编译ncurses,readline,sqlite

仿照openssl的方法,编译另外三个库;其实还有一个zlib需要编译,当然后面不让python支持bz2就可以忽略。
注意readline编译最好选择--with-curses,然后把编译好的ncurses链接上。库类文件编译,尽量都加-fPIC,这是什么,不从汇编说还真说不清楚,还是大家自己去看官方文档吧。
对于localeconv的问题,大家最好改写下那个locale.h,在里面把localeconv的struct里fix放上你要的字符,比如decimal_point是".",这样后面都不会出这类locale的问题了。
这里给出快捷的解决方案就是把localeconv干掉,直接hardcode:

[plain] view plain
# 在ncurses编译之前,需要打的补丁
sed -i "s/#define isDecimalPoint(c) .*/#define isDecimalPoint(c) ((c) == '.')/" form/fty_num.c
sed -i "s/localeconv()/NULL/" form/fty_num.c

[plain] view plain
# 编译ncurses
./configure --prefix=/YourPath --disable-home-terminfo --without-ada
make
make install
[plain] view plain
# 编译readline
./configure --prefix=/YourPath --host=arm-linux --build=x86_64-linux \
--enable-static --enable-shared --with-curses
make
make install
[plain] view plain
# 编译sqlite
./configure --host=arm-linux --build=x86_64-linux
make
make install
4. 编译Python:
其实过程整体和openssl没有什么区别,细节上有一些注意事项。
- configure文件是需要手动fix的,打开文件,搜索 ac_cv_file__dev_ptmx 和 ac_cv_file__dev_ptc;删除对这两个变量的自动判断。手动去Android查看/dev文件夹里有没有ptmx和ptc设备,有就设置为yes没就no:

[plain] view plain
ac_cv_file__dev_ptmx=yes
ac_cv_file__dev_ptc=no

- 打开Moles/Setup.dist文件,把需要的python模块前面的#去掉,比如#_socket socketmole.c timemole.c,要python支持网络socket接口,需要把#去掉;建议尽量多加一些包;实在编译不过的包不要,有些模块需要额外下载开源软件库编译,就不只openssl,ncurses,readline,sqlite了。

这样就可以configure 了:

[plain] view plain
./configure --host=arm-unknown-linux-gnu --build=x86_64-unknown-linux-gnu \
--enable-ipv6

- 有一段编译会报错,仔细检查,发现python需要编译一个程序,这个程序跑在host上,但gcc是arm的,host linux是x86_64的,所以我们需要复制一份解压好的python代码,然后用本地原有的gcc编译;当然编译时直接./configure && make就可以了,直到Parser文件夹下出现了pgen这个可执行文件;把它拿出来,复制到另一个python源码的Parser文件夹中,修改Makefile:

[plain] view plain
sed -i "s|\$(PGEN):.*|\$(PGEN):|" Makefile
sed -i "s|\$(CC) \$(OPT) \$(LDFLAGS) \$(PGENOBJS) \$(LIBS) -o \$(PGEN)|echo \"fake Parser/pgen\"|" Makefile
- 解决locale的问题,还有一些常量问题,笨方法hardcode:

[plain] view plain
sed -i "s|.*localeconv().*||" Objects/stringlib/localeutil.h
sed -i "s|locale_data->grouping|\"\"|" Objects/stringlib/localeutil.h
sed -i "s|locale_data->thousands_sep|\"\"|" Objects/stringlib/localeutil.h
sed -i "s|.*localeconv().*||" Objects/stringlib/formatter.h
sed -i "s|locale_data->grouping|\"\"|" Objects/stringlib/formatter.h
sed -i "s|locale_data->thousands_sep|\"\"|" Objects/stringlib/formatter.h
sed -i "s|locale_data->decimal_point|\".\"|" Objects/stringlib/formatter.h
sed -i "s|.*localeconv().*||" Python/pystrtod.c
sed -i "s|locale_data->decimal_point|\".\"|" Python/pystrtod.c
sed -i "s|I_PUSH|0x5302|" Moles/posixmole.c
sed -i "s|p->pw_gecos|\"\"|" Moles/pwdmole.c

- Moles/socketmole.c: 需要去掉一些#if,不然头文件里没有定义,或者直接去$ANDROID的include文件夹把相应.h文件补充完整也可以。

[cpp] view plain
...
Py_BEGIN_ALLOW_THREADS
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_acquire_lock(netdb_lock, 1);
#endif
h = gethostbyaddr(ap, al, af);
Py_END_ALLOW_THREADS
ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);
#ifdef USE_GETHOSTBYNAME_LOCK
PyThread_release_lock(netdb_lock);
#endif
return ret;
...

make然后make -i install,好啦,python编译出来啦!

下面就是放到android上跑了。
需要Android是root的,不root也可以,就是得找个地方放。
需要把python编译好的文件夹打包放到android上,还有sqlite里的那个so文件。
root的话可以在/system/bin里软链接一个python。当然,sqlite.so.3要放在/system/lib里。
其实sqlite是可以不编译的,但是我们的Django需要它,所以还是弄出来吧,ssl也可以不用,但是为了服务器支持https,还是编译下吧。
这样就可以运行python了。

[html] view plain
# python
>>> 1+2
3
然后下载setuptools (https://pypi.python.org/pypi/setuptools/7.0) 和 pip (https://pypi.python.org/pypi/pip/1.5.6) 解压并安装:

[plain] view plain
gzip -d setuptools-7.0.tar.gz
tar xf setuptools-7.0.tar
cd setuptools-7.0
python setup.py build
python setup.py install

gzip -d pip-1.5.6.tar.gz
tar xf pip-1.5.6.tar
cd pip-1.5.6
python setup.py build
python setup.py install
把pip软链接到/system/bin。好了,python有了pip,哈哈,随心安装包吧。先来个pip install virtualenv
接下去可以安装django django-sslserver,把django-admin软链接到/system/bin,就可以写网站啦:

[plain] view plain
django-admin startproject test001
cd test001
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
不安装django也可以直接对一个文件夹提供http服务:

[plain] view plain
python -m SimpleHTTPServer

有了server,在家庭里就可以搭建平台啦,如果有多个手机,连上wifi,就可以不用接线,完成无线分布式服务器,赶快练习loadbalance吧。

嗯嗯,看看需不需要用手机服务器随时监控家里的活动,然后插上SIM卡还能自动给我发短信,嘿嘿。

后面我们来想象怎么解决pip install有时需要编译c文件的问题。其实有团队已经解决了这个问题。
下载Droid for GCC plugin的apk:http://www.liqucn.com/rj/228351.shtml (这个不是官网,最好去google play下载)
把apk解压,然后找到gcc的压缩包,里面就有gcc了,把它放到Android上:

[plain] view plain
#include <stdio.h>
int main() {
printf("hello world!\n");
return 0;
}
然后gcc -o test test.c,并运行./test,完美输出hello world。赶紧软链接到/system/bin里吧。
好了,这样numpy都可以编译安装了。还可以编译下erl,把rabbitmq编译下,弄个分布式也不是问题。最好移植一下lxc,然后把raspberry里的arm版java搬过来就无敌啦。买个USBminiB转RJ45的头就可以插网线了。

总体来说,可以搭建移动服务器了,以后写一些网页版小应用,想用的时候android开个热点,电脑一连,开始enjoy!

❹ 如何编译可以在Windows下运行的带有Python支持的ARM Linux GDB

做这件事情的目的是为了在QtCreator里调试ARM Linux程序的时候,能看清楚QString、QList这些Qt特有的对象的内容,而不是一个完全看不懂的结构体。
目前(2014年8月)Linaro、CodeSourcery的GCC工具链里的GDB都不支持Python。想知道你用的GDB支持不支持,试一试就行,这样表示不支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Python scripting is not supported in this of GDB.
这样表示支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Hello GDB!
这件事情乍一看也很简单,只要把GDB源码下载下来,然后再配置,打开Python支持就行了。实际上会遇到的问题是,在MinGW下,又要与“\”和“:”这两个Windows路径里的刺头斗争了。我觉得我之前挺傻,编译MinGW下Qt的时候,就去硬磕源码和configure脚本去了。这次GDB的configure是自动生成的,不是给人看的,configure.ac看起来也很费劲,根本磕不下去,于是我换了个思路,在ubuntu下交叉编译吧,sudo apt-get install mingw32,这是Ubuntu下的MinGW交叉编译器。
然后是依赖,这样的GDB要依赖expat和python的开发版本。如果是ubuntu底下直接编译,apt-cache search一下他们的开发版本,然后sudo apt-get install一下就好了;给MinGW交叉编译就麻烦了。先说expat,这个好办,把http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz下载下来,然后:
./configure --prefix=[安装目录,如/home/c/mingw-gdb/expat] --host=i586-mingw32msvc
make
make install
会提示一些警告,无视即可。
Python就无语了,目前的GDB貌似最高支持Python 2.7,而2.7版本的Python本身不支持MinGW…… 好在有高手做了Patch,也写了说明,可以参考这文章:http://mdqinc.com/blog/2011/10/cross-compiling-python-for-windows-with-mingw32/
但是,就算这样,编译也充满挑战,要修复很多问题,出来的Python还少“nt”模块。就在我觉得没办法的时候,突然发现Windows版Qt提供的MinGW居然内置了Python开发包,位置在Tools/mingw48_32/opt,赶紧把它拷贝到Linux下,比如/home/c/mingw-gdb/python。当然,你也必须确保ubuntu下有可用的python。
然后,给GDB打一个补丁:
--- gdb-7.8/gdb/configure 2014-07-29 20:37:42.000000000 +0800
+++ gdb-7.8-old/gdb/configure 2014-08-30 00:08:27.122042706 +0800
@@ -8263,21 +8263,22 @@
# We have a python program to use, but it may be too old.
# Don't flag an error for --with-python=auto (the default).
have_python_config=yes
- python_includes=`${python_prog} ${srcdir}/python/python-config.py --includes`
+ python_config_tool=`echo ${python_prog} | sed "s#python.exe#python-config#g"`
+ python_includes=`${python_config_tool} --includes`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --includes" "$LINENO" 5
fi
fi
- python_libs=`${python_prog} ${srcdir}/python/python-config.py --ldflags`
+ python_libs=`${python_config_tool} --ldflags`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --ldflags" "$LINENO" 5
fi
fi
- python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix`
+ python_prefix=`${python_config_tool} --exec-prefix`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
@@ -8343,12 +8344,12 @@
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+#if ac_fn_c_try_link "$LINENO"; then :
have_libpython=${version}
found_usable_python=yes
PYTHON_CPPFLAGS=$new_CPPFLAGS
PYTHON_LIBS=$new_LIBS
-fi
+#fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
CPPFLAGS=$save_CPPFLAGS
这个补丁的目的是强制为检测到python。
然后给拷贝到Linux下的python开发包打一个补丁:
--- python-old/bin/python-config 2013-04-18 02:43:01.000000000 +0800
+++ python/bin/python-config 2014-08-30 00:53:16.630060288 +0800
@@ -1,4 +1,4 @@
-#!/temp/x32-480-posix-dwarf-r2/mingw32/opt/bin/python2.7.exe
+#!/usr/bin/python

import sys
import os
@@ -31,26 +31,23 @@

for opt in opt_flags:
if opt == '--prefix':
- print sysconfig.PREFIX
+ print '../python'

elif opt == '--exec-prefix':
- print sysconfig.EXEC_PREFIX
+ print '../python'

elif opt in ('--includes', '--cflags'):
- flags = ['-I' + sysconfig.get_python_inc(),
- '-I' + sysconfig.get_python_inc(plat_specific=True)]
+ flags = ['-I' + os.path.split(os.path.realpath(__file__))[0] + '/../include/python2.7']
if opt == '--cflags':
- flags.extend(getvar('CFLAGS').split())
+ flags += ['-fno-strict-aliasing -DMS_WIN32 -DMS_WINDOWS -DHAVE_USABLE_WCHAR_T -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes']
print ' '.join(flags)

elif opt in ('--libs', '--ldflags'):
- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
- libs.append('-lpython'+pyver)
+ libs = ['-lm -lpython2.7 -Wl,--out-implib=libpython2.7.dll.a']
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
- libs.insert(0, '-L' + getvar('LIBPL'))
- libs.extend(getvar('LINKFORSHARED').split())
+ libs.insert(0, '-L' + os.path.split(os.path.realpath(__file__))[0] + '/../lib/python2.7/config')
print ' '.join(libs)

因为Linux下是无法运行开发包中的python.exe的,所以这个补丁借用了ubuntu的python。里面的cflags和ldflags都是在Windows底下运行原始python-config获得的。prefix和exec-prefix设成“../python”,可以在编译完以后,把python开发包拷贝到gdb安装目录里面的python子目录,这样运行GDB的时候就不需要设定PYTHONHOME环境变量了。
最后一个事情,确保你的Linux下有arm交叉编译器,我的是arm-linux-gnueabihf,是啥target就写啥。
准备工作做完了,开始配置和编译:
./configure --with-expat --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=[expat安装位置] --with-python=[python开发包安装位置/bin/python.exe]
make
make DESTDIR=[GDB安装位置] install
然后把GDB安装位置下面的所有文件拷贝到Windows下,再把python开发包拷贝到同目录下的python子目录,大功告成。
如果提示没找到libpython2.7.dll,那就把GDB安装目录的python/bin下的拷贝到bin下。
如果发现生成的exe文件太大了,那就strip一下。
2015年9月12日追加:
在windows下调试时,一般会提示说加载不了共享库,让你用"set sysroot"或"set solib-search-path"之类设定路径的。这个问题可以通过.gdbinit文件,用上面这两条命令来设定路径解决,如果想一劳永逸,可以在编译的时候加上host_configargs环境变量来解决这个问题:
host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm ./configure ...
或者
export host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm
./configure ...

后面的路径是你放在windows下的sysroot的位置。

❺ 如何交叉编译Python到ARM-Linux平台

平时编译python用的gcc,你装个交叉编译环境,把编译器改成arm-linux-gcc编译出来的就是arm版本的

❻ 如何交叉编译Python到ARMLinux平台 / 蓝讯

步骤一:部署protoc.exe
1)sudo su ---进入管理模式
//以下操作切换至protobuf文件夹下
2)。/configure
3)make
4)make check
5)make install
此时可以查看protobuf文件夹下面的makefile文件,可以查看-build表示的本机环境以及-host表示的编译库的运行环境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(这两个参数在后续配置脚本需要用到,与后面脚步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0后缀“arm-apple-darwin12.3.0”保持一致)
6)make distclean清理已生成的makefile,为交叉编译配置新makefile做准备

热点内容
linuxshell脚本中if 发布:2024-05-07 13:25:01 浏览:220
phpmysql扩展 发布:2024-05-07 13:25:01 浏览:799
星密码开网店怎么样 发布:2024-05-07 13:23:26 浏览:353
安卓手机java模拟器 发布:2024-05-07 12:43:07 浏览:912
c语言java哪个好学 发布:2024-05-07 12:35:16 浏览:334
奥特曼访问 发布:2024-05-07 12:34:38 浏览:893
离线存储本地存储 发布:2024-05-07 12:30:23 浏览:412
win764sql2000安装 发布:2024-05-07 12:18:07 浏览:77
beego上传文件 发布:2024-05-07 11:59:20 浏览:211
安卓如何设置拒接来电 发布:2024-05-07 11:56:25 浏览:570