天天看點

ARM開發闆移植Python的各種坑

一、準備

資料準備:

1.Python-2.7.2.tar.bz2  官網可下載下傳

2.Python-2.7.2-xcompile.patch   網上找的,具體來源不明,需要與Python版本相同

3交叉編譯器 gcc-3.4.5-glibc-2.3.6,一定要用開發闆資料裡帶的與開發闆比對的交叉編譯器,此處有大坑

二、流程梳理(正常流程)

1.下載下傳上述檔案

2.安裝交叉編譯器(PC中操作,64位 Ubuntu 16.04 )

(1)将開發闆資料裡的 arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 解壓到 /opt (可自己選擇,後續配置環境變量時對應即可)中。

(2)shell中運作

sudo gedit /etc/profile
           

          在文檔最後添加 export  PATH="$PATH:/opt/gcc-3.4.5-glibc-2.3.6/bin" ,路徑與上述解壓路徑對應

          運作 source 指令使環境變量生效,也可重新開機使之生效

source /etc/profile
           

          運作下邊指令驗證環境變量是否配置成功 ,成功會顯示版本号

arm-linux-gcc -v
           
ARM開發闆移植Python的各種坑

3.交叉編譯Python源碼

(1)将Python源碼 Python-2.7.2.tar.bz2 與 Python-2.7.2-xcompile.patch  移動到同一檔案夾,解壓源碼

tar xjvf Python-2.7.2.tar.bz2   #解壓出 Python-2.7.2 檔案夾

cd Python-2.7.2                 #進入 Python-2.7.2
           

(2)編譯HOST版解釋器

編譯Python的嵌入式版需要解釋器解析setup.py進而編譯Python的子產品,是以需要先編譯出HOST的解釋器。

./configure                            #
make python Parser/pgen                #
mv  python  hostpython                 #
mv  Parser/pgen  Parser/hostpgen       #
make distclean                         #
           

(3)打更新檔 

patch -p1 < ../Python-2.7.2-xcompile.patch
           

(4)交叉編譯配置

設定交叉編譯工具鍊為arm-linux(根據交叉編譯器設定),編譯生成的執行檔案存放目錄為上層目錄的_install檔案夾。

建立 cc1.sh 檔案,打開編輯,

#!/bin/sh
CC = arm-linux-gcc                #與要使用的交叉編譯器對應
CXX= arm-linux-g++                #與要使用的交叉編譯器對應
AR = arm-linux-ar                 #與要使用的交叉編譯器對應
RANLIB=arm-linux-ranlib
 ./configure --host=arm-linux --prefix=$PWD/../Install \
     --build=x86_64-linux-gnu \
#	 --enable-readline	\
#    --enable-ipv6 \
#    --enable-shared \
     ac_cv_file__dev_ptmx="yes" \
     ac_cv_file__dev_ptc="no"

           

添加可執行權限 

chmod +x cc1.sh
           

(5)編譯&安裝

建立 cc2.sh 、cc3.sh 檔案,打開編輯,并添加可執行權限 

#!/bin/sh
#cc2.sh
make  HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen 
BLDSHARED="arm-linux-gcc -shared"  \                #與要使用的交叉編譯器對應
CROSS_COMPILE=arm-linux- \ 
CROSS_COMPILE_TARGET=yes \
           
#!/bin/sh
#cc3.sh
make install HOSTPYTHON=./hostpython \
     BLDSHARED="arm-linux-gcc -shared" \           #與要使用的交叉編譯器對應
     CROSS_COMPILE=arm-linux- \
     CROSS_COMPILE_TARGET=yes \
     prefix=$PWD/../_Install
           
chmod +x cc2.sh cc3.sh
           

(6)依次運作cc1.sh,cc2.sh,cc3.sh

成功後在上層檔案夾下的 _install 檔案夾中,會出現以下4個檔案夾,

ARM開發闆移植Python的各種坑

 進入 bin檔案夾,運作 ./python ,出現如下提示,說明交叉編譯成功

ARM開發闆移植Python的各種坑

 (7)将_install 檔案夾打包 Python-2.7.2_install.tar.bz2 

tar cjvf Python-2.7.2_install4.tar.bz2 _install/
           

(8)通過虛拟機WinPC 或另一台window 電腦,使用SecureCRT 将 Python-2.7.2_install.tar.bz2 傳到 ARM 開發闆上

ftpget -p 21 <開發闆IP> Python-2.7.2_install4.tar.bz2 /ToArm/Python-2.7.2_install4.tar.bz2
           

/ToArm 是SecureCRT 配置的本地路徑

(9)在開發闆上解壓 Python-2.7.2_install.tar.bz2 

進入 _install/bin檔案夾,執行 ./python ,成功

ARM開發闆移植Python的各種坑

4.總結填坑

(1)運作cc2.sh、cc3.sh 時 ,提示:unable to execute arm-linux-gcc: No such file or directory 

ARM開發闆移植Python的各種坑

       運作結束後進入生成的_Install/bin,運作./python,顯示 [GCC 5.4.0 20160609] on linux,GCC版本與之前設定的交叉編譯版本不一緻,說明沒有真正使用交叉編譯器,而是使用系統預設的 x86_64-linux-gnu-gcc  編譯器,此版本拷貝到開發闆上輸入./python是不能運作的,會提示帶亂碼的報錯資訊。

ARM開發闆移植Python的各種坑

填坑:unable to execute arm-linux-gcc: No such file or directory的原因發現了2個:

1)交叉編譯器 gcc 是 32 位,在64位系統上運作,需要安裝 ia32-libs (已失效),替換安裝 lib32ncurses5 和 lib32z1

ARM開發闆移植Python的各種坑

2)運作 cc1.sh 、cc2.sh、cc3.sh 時不要 sudo(深坑) ,開始運作是習慣性的加了sudo,怎麼都不行,多次實驗後才發現去掉sudo才可以正常編譯。

(2)交叉編譯器版本

開發闆資源包中的交叉編譯器版本為 gcc-3.4.5-glibc-2.3.6,在處理上面問題時,懷疑過交叉編譯器版本過舊的原因,在網上找了個 arm-linux-gcc-4.4.3-20100728.tar.gz,于是給自己又挖了個深坑。

通過上述(1)的方法,解決了unable to execute arm-linux-gcc: No such file or directory的問題,一路編譯通過,上闆運作,滿懷希望,于是激動的出現了 -sh : ./python :not found(事後驗證,如果交叉編譯器使用原開發闆系統原配的對應版本,此問題不會出現),什麼鬼,百度、google一番,因為缺少庫檔案,在PC上使用

arm-linux-readelf -a ./python >2.txt
           
ARM開發闆移植Python的各種坑

提示缺少/lib/ld-linux.so.3,到交叉編譯器arm-linux-gcc-4.4.3-20100728.tar.gz解壓出來的包中找到 ld-linux.so.3,拷貝到開發闆 /lib 下,再次回到python檔案夾下運作 ./python,-sh: ./python: Permission denied,噗!!!

是沒有運作權限嗎? chmod +x python 不行, chmod 777 python 還不行,什麼情況啊,繼續百goo,終于在某個角落提到編譯器版本問題,換回原版 gcc-3.4.5-glibc-2.3.6 重新來過,一路下來,竟然一次通過。./python 終于出現了理想中的界面

ARM開發闆移植Python的各種坑

事後總結:經過驗證,如果交叉編譯器使用正确的版本,即 gcc-3.4.5-glibc-2.3.6,依賴的庫為  ld-linux.so.2,此庫檔案在開發闆 /lib 中已經存在,是以在運作 ./python 是并不會出現  -sh : ./python :not found,後面也不會出現 -sh: ./python: Permission denied。

反思:填坑 = 學習

作為一個新手,一路跌跌撞撞,總算解決一個在别人看來可能都不值一提的問題,以至于在網上都不能找到幾條同樣問題的資料。遇到的各種坑,有些是因為我使用的開發闆和網上教程使用的開發闆有所差別,有些純粹是自己給自己找麻煩,但是歸根結底,還是因為自己是初學,知識積累有限,遇到問題沒有方向,不知道該往哪些方面去思考、去查資料。經過這一番折騰,對ARM移植Python的過程有了一個梳理,同時對交叉編譯有了一個大緻的了解,在觸及類似問題時,也有了大緻的解決方向。

至于碰到的各種坑,在填的時候,是各種咬牙切齒。但是在填完之後,有的隻是感激。

對于我這樣一個剛接觸嵌入式的新手來說,如果沒有遇到各種各樣的問題,一切按照網上的示例教程,一帆風順的照葫蘆畫瓢,沒有思考,沒有實踐,我可能能夠快速的搭建起特定的應用場景,但是一旦碰到哪怕一丁點特殊情況,依然會被打回原形,不知所措。是以,填坑的過程,就是學習進步的過程,我很慶幸碰到了那麼多坑,也很慶幸誤打誤撞的給自己挖了那麼多坑,讓我在入門的時候多學一些,多想一些,多積累一些。