編譯環境:ubuntu-14.04.1
編譯器:gcc、arm-hisiv200-linux-gnueabi
python版本:2.7.3
整個過程相對簡單,分為三個步驟:
編譯x86版本的python
給python原始碼打上交叉編譯補丁
交叉編譯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.3-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.7/test/test___all___.py
錯誤按以上方法進行移植時我沒有遇到錯誤,但是之前我按其他方法進行移植時遇到了一下錯誤,這裡記錄一下。
編譯時遇到過如下錯誤
#error "this platform's pyconfig.h needs to define py_format_long_long"
編輯pyconfig.**件,找到#undef py_format_long_long,新增一行#define py_format_long_long 「ll」
在目標機器上執行test時遇到如下錯誤
'import site' failed; use -v fortraceback
traceback (most recent calllast):
file"test.py", line 2, in import os
importerror: no module named os
在執行的過程中發現所有的python自帶的py/pyc庫檔案找不到,是由於pythonhome指定的路徑有問題,和pythonhome下檔案架構有問題,一定為:$/lib/python2.7。一般我們將編譯好的資料夾(bin,lib,include,share)直接複製到usr下,是沒有這個問題的(python庫會放到/usr/lib/python2.7裡面)
Python可以多繼承嗎??
物件導向的程式設計帶來的主要好處之一是 的重用,實現這種重用的方法之一是通過繼承機制。繼承完全可以理解成類之間的父與子的關係。例子 class prtutu def init self print prtutu class prtutu1 def init self,a print prtutu1 ...
簡單的mysql備份和還原(可以用來移植資料庫))
進入到mysql安裝目錄下的bin資料夾 cmd mysqldump uroot ppassword database name abc.sql abc.sql 為生成的備份檔案,字尾和目錄可以自己定義 cmd mysql uroot ppassword new database abc.sql 還...
python 將擴充套件包打包 移植依賴庫
利用的是python的pip功能 pip安裝點我 pip目錄下使用命令 pip freeze requirements.txt 就會在pip目錄生成 requirements.txt 檔案,該檔案內就是當前環境所安裝的所有擴充套件包 開啟後就是安裝的模組和對應的版本,如 numpy 1.11.1 p...