python及第三方庫交叉編譯

一、前言:網上關于python的交叉編譯的文章很多,但是關于python第三庫的交叉編譯的文章就比較少了 , 而且很多標題是第三方庫的交叉編譯 , 但是實際上用到的都是不需要交叉編譯就能用的庫 , 可參考性不強,最近關于python及其第三方庫的交叉編譯也踩了不少坑,記錄一下!
二、交叉編譯介紹:1、什么是交叉編譯:在一個平臺上生成另一個平臺上的可執行代碼 。
2、為什么要交叉編譯:在進行嵌入式系統的開發時,運行程序的目標平臺通常具有有限的存儲空間和運算能力 , 比如常見的ARM 平臺,其一般的靜態存儲空間比較??,而CPU運算能力弱 。這種情況下,在ARM平臺上進行本機編譯就不太可能了,為了解決這個問題,交叉編譯工具就應運而生了 。通過交叉編譯工具,我們就可以在CPU能力很強、存儲控件足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執行程序 。
三、python及其第三方庫的交叉編譯背景1、交叉編譯鏈:rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2
2、目標板子(target主機):armv7l
3、執行交叉編輯的主機(build主機):ubuntu18-x86_64
4、python版本:3.5.2
5、numpy==1.18.5
四、交叉編譯的準備工作build主機是我新安裝的一個ubuntu18的新虛擬機,所以連gcc 都沒有的
1、安裝gcc: sudo apt-get install gcc-8 -y
2、將gcc-8指定成默認的gcc:  sudo ln -s /usr/bin/gcc-8 /usr/bin/gcc

python及第三方庫交叉編譯

文章插圖
3、安裝cmake:  sudo apt-get install make cmake -y
4、安裝libffi-dev 交叉編譯 python 需要的依賴:  sudo apt-get install libffi-dev
5、安裝zip 解壓壓縮包使用:sudo apt-get install zip -y
五、交叉編譯python及其第三方的思路1、在build主機上交叉編譯zlib庫,這個是python源碼安裝必須的依賴庫
2、在build主機上交叉編譯openssl庫,這個雖然不是源碼安裝必須的依賴庫 , 但是大部分其他庫都有可能使用到這個庫
3、在build主機上安裝build主機上的python版本,我們成為python-build
4、在build主機上交叉編譯target主機上的python版本,我們稱之為python-target
5、在build主機上通過crossenv搭建target-python的運行虛擬環境
6、在crossenv虛擬環境中通過pip打包交叉編譯第三方庫為.whl形式的
六、準備交叉編譯工具1、解壓交叉編譯鏈:說明不同的平臺的使用的交叉編譯鏈不同,但是思路和步驟是一樣的 。
tar jxvf rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2
解壓之后得到一個名為 host 的文件夾 。
python及第三方庫交叉編譯

文章插圖
2、進入 host 目錄: cd host
3、執行 relocate-sdk.sh 指令:  ./relocate-sdk.sh?。ú皇撬薪徊姹嘁肓炊夾枰庖徊降模?
4、將交叉編譯鏈添加到環境變量:vim /etc/profile
5、在最后添加:export PATH=$PATH:/home/host/bin  這里的路徑根據自己實際的路徑進行修改即可 。
python及第三方庫交叉編譯

文章插圖
6、重新加載環境變量:source /etc/profile
7、測試:arm-buildroot-linux-gnueabihf-gcc -v
python及第三方庫交叉編譯

文章插圖
七、準備openssl-build這里我已經準備好了openssl-1.0.2g.tar.gz的壓縮包,這里我嘗試了openssl-1.1.1的版本,但是和python3.5.2不太合適 , 總是有問題,所以這里我使用的是openssl-1.0.2的版本
1、 解壓源碼包,這些源碼包我都是放在/home路徑下的:tar -xzvf openssl-1.0.2g.tar.gz
2、對壓縮包進行重命名,區分是在build主機上用的還是在target主機上用的,在build主機上用的我都統一在后面加上_build,在target主機上使用的統一在后面加上_target
mv openssl-1.0.2g openssl-1.0.2g-build
3、cd openssl-1.0.2g-build
4、設置編譯環境:./config --prefix=/home/openssl-1.0.2g-build/openssl-build
其中: --prefix是指定編譯后的安裝的路徑
5、執行編譯安裝:make && make install   此時在/home/openssl-1.0.2g-build里面就會有openssl-build文件夾
python及第三方庫交叉編譯

文章插圖
6、因為安裝的ubuntu18中默認的openssl是1.1.1 , 我們需要換成我們的openssl-1.0.2g
python及第三方庫交叉編譯

文章插圖
  把以前的備份:sudo mv /usr/bin/openssl /usr/bin/openssl.old
7、建立新的軟連接:sudo ln -s /home/openssl-1.0.2g-build/openssl-build/bin/openssl /usr/bin/openssl

推薦閱讀