一、準備
資料準備:
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
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個檔案夾,
進入 bin檔案夾,運作 ./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 ,成功
4.總結填坑
(1)運作cc2.sh、cc3.sh 時 ,提示:unable to execute arm-linux-gcc: No such file or directory
運作結束後進入生成的_Install/bin,運作./python,顯示 [GCC 5.4.0 20160609] on linux,GCC版本與之前設定的交叉編譯版本不一緻,說明沒有真正使用交叉編譯器,而是使用系統預設的 x86_64-linux-gnu-gcc 編譯器,此版本拷貝到開發闆上輸入./python是不能運作的,會提示帶亂碼的報錯資訊。
填坑:unable to execute arm-linux-gcc: No such file or directory的原因發現了2個:
1)交叉編譯器 gcc 是 32 位,在64位系統上運作,需要安裝 ia32-libs (已失效),替換安裝 lib32ncurses5 和 lib32z1
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
提示缺少/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 終于出現了理想中的界面
事後總結:經過驗證,如果交叉編譯器使用正确的版本,即 gcc-3.4.5-glibc-2.3.6,依賴的庫為 ld-linux.so.2,此庫檔案在開發闆 /lib 中已經存在,是以在運作 ./python 是并不會出現 -sh : ./python :not found,後面也不會出現 -sh: ./python: Permission denied。
反思:填坑 = 學習
作為一個新手,一路跌跌撞撞,總算解決一個在别人看來可能都不值一提的問題,以至于在網上都不能找到幾條同樣問題的資料。遇到的各種坑,有些是因為我使用的開發闆和網上教程使用的開發闆有所差別,有些純粹是自己給自己找麻煩,但是歸根結底,還是因為自己是初學,知識積累有限,遇到問題沒有方向,不知道該往哪些方面去思考、去查資料。經過這一番折騰,對ARM移植Python的過程有了一個梳理,同時對交叉編譯有了一個大緻的了解,在觸及類似問題時,也有了大緻的解決方向。
至于碰到的各種坑,在填的時候,是各種咬牙切齒。但是在填完之後,有的隻是感激。
對于我這樣一個剛接觸嵌入式的新手來說,如果沒有遇到各種各樣的問題,一切按照網上的示例教程,一帆風順的照葫蘆畫瓢,沒有思考,沒有實踐,我可能能夠快速的搭建起特定的應用場景,但是一旦碰到哪怕一丁點特殊情況,依然會被打回原形,不知所措。是以,填坑的過程,就是學習進步的過程,我很慶幸碰到了那麼多坑,也很慶幸誤打誤撞的給自己挖了那麼多坑,讓我在入門的時候多學一些,多想一些,多積累一些。