欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于python中第三方庫交叉編譯的問題

 更新時間:2022年09月28日 15:54:17   作者:Se7eN_HOU  
這篇文章主要介紹了python及第三方庫交叉編譯,通過交叉編譯工具,我們就可以在CPU能力很強、存儲控件足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序,需要的朋友可以參考下

一、前言:

  網(wǎng)上關(guān)于python的交叉編譯的文章很多,但是關(guān)于python第三庫的交叉編譯的文章就比較少了,而且很多標題是第三方庫的交叉編譯,但是實際上用到的都是不需要交叉編譯就能用的庫,可參考性不強,最近關(guān)于python及其第三方庫的交叉編譯也踩了不少坑,記錄一下!

二、交叉編譯介紹:

  1、什么是交叉編譯:在一個平臺上生成另一個平臺上的可執(zhí)行代碼。

  2、為什么要交叉編譯:在進行嵌入式系統(tǒng)的開發(fā)時,運行程序的目標平臺通常具有有限的存儲空間和運算能力,比如常見的ARM 平臺,其一般的靜態(tài)存儲空間比較小,而CPU運算能力弱。這種情況下,在ARM平臺上進行本機編譯就不太可能了,為了解決這個問題,交叉編譯工具就應運而生了。通過交叉編譯工具,我們就可以在CPU能力很強、存儲控件足夠的主機平臺上(比如PC上)編譯出針對其他平臺的可執(zhí)行程序。

三、python及其第三方庫的交叉編譯背景

  1、交叉編譯鏈:rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2

  2、目標板子(target主機):armv7l

  3、執(zhí)行交叉編輯的主機(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

  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的運行虛擬環(huán)境

  6、在crossenv虛擬環(huán)境中通過pip打包交叉編譯第三方庫為.whl形式的

六、準備交叉編譯工具

  1、解壓交叉編譯鏈:說明不同的平臺的使用的交叉編譯鏈不同,但是思路和步驟是一樣的。

tar jxvf rv1126-arm-buildroot-linux-gnueabihf-toolchain.tar.bz2

    解壓之后得到一個名為 host 的文件夾。

  2、進入 host 目錄: cd host

  3、執(zhí)行 relocate-sdk.sh 指令:./relocate-sdk.sh (不是所有交叉編譯鏈都需要這一步的)

  4、將交叉編譯鏈添加到環(huán)境變量:vim /etc/profile

  5、在最后添加:export PATH=$PATH:/home/host/bin 這里的路徑根據(jù)自己實際的路徑進行修改即可。

  6、重新加載環(huán)境變量:source /etc/profile

  7、測試:arm-buildroot-linux-gnueabihf-gcc -v  

七、準備openssl-build

  這里我已經(jīng)準備好了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、對壓縮包進行重命名,區(qū)分是在build主機上用的還是在target主機上用的,在build主機上用的我都統(tǒng)一在后面加上_build,在target主機上使用的統(tǒng)一在后面加上_target

mv openssl-1.0.2g openssl-1.0.2g-build

  3、cd openssl-1.0.2g-build

  4、設(shè)置編譯環(huán)境:./config --prefix=/home/openssl-1.0.2g-build/openssl-build

    其中: --prefix是指定編譯后的安裝的路徑

  5、執(zhí)行編譯安裝:make && make install 此時在/home/openssl-1.0.2g-build里面就會有openssl-build文件夾  

  6、因為安裝的ubuntu18中默認的openssl是1.1.1,我們需要換成我們的openssl-1.0.2g

    把以前的備份: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

  8、編輯鏈接文件:vim /etc/ld.so.conf.d/libc.conf

  9、在libc.conf文件中添加:/usr/openssl-1.0.2g-build/openssl-build/lib

  10、重新加載配置:ldconfig

  11、測試:openssl version ,已經(jīng)變成1.0.2g版本了

八、準備openssl-target

  1、同樣是再次解壓openssl源碼包,這次解壓的源碼包用來交叉編譯給target-python使用的:tar -xzvf openssl-1.0.2g.tar.gz

  2、更改名字:mv openssl-1.0.2g openssl-1.0.2g-target

  3、cd openssl-1.0.2g-target

  4、設(shè)置編譯環(huán)境:./config no-asm --shared --cross-compile-prefix=arm-buildroot-linux-gnueabihf- --prefix=/home/openssl-1.0.2g-target/openssl-target

    解釋:no-asm :加上no-asm 表示不使用匯編代碼加速編譯,不然會報錯

       --cross-compile: 指定交叉編譯鏈的前綴,這樣在交叉編譯openssl就會使用我們的交叉編譯鏈進行交叉編譯了

       --prefix: 已經(jīng)是交叉編譯后的路徑

  5、在編譯后生成的Makefile中有兩處是 -m64 的標記要刪除,因為交叉編譯后是在32位的板子上運行,所以這一步也要改:sed -i 's/-m64//' Makefile

  6、執(zhí)行編譯安裝:make && make install

  目前我們就把openssl-build和openssl-target都準備好了

九、準備zlib-build

  1、解壓源碼包:unzip zlib1211.zip

  2、改名:mv zlib-1.2.11 zlib-1.2.11-build

  3、cd zlib-1.2.11-build

  4、設(shè)置編譯環(huán)境:./configure --prefix=/home/zlib-1.2.11-build/zlib-build

  5、執(zhí)行編譯安裝:make && make install

十、準備zlib-target

  1、解壓源碼包:unzip zlib1211.zip

  2、改名:mv zlib-1.2.11 zlib-1.2.11-target

  3、cd zlib-1.2.11-target

  4、設(shè)置交叉編譯器:export CC=arm-buildroot-linux-gnueabihf-gcc 通過export 設(shè)置的環(huán)境變量都是臨時一次性的,當shell窗口關(guān)閉了就失效了

  5、設(shè)置編譯環(huán)境:./configure --prefix=/home/zlib-1.2.11-target/zlib-target --enable-shared

  6、執(zhí)行編譯安裝:make && make install

  目前我們也已經(jīng)包zlib-build和zlib-target準備好了

十一、準備ctypes-build

  這一步已經(jīng)在準備工作中做了:sudo apt-get install libffi-dev

十二、準備ctypes-target

  1、解壓源碼包:tar -xzvf libffi-3.2.1.tar.gz

  2、改名:mv libffi-3.2.1 libffi-3.2.1-target

  3、cd libffi-3.2.1-target

  4、設(shè)置交叉編譯器:export CC=arm-buildroot-linux-gnueabihf-gcc 如果這一步在準備zlib-target沒有關(guān)閉shell窗口的時候,可以不用設(shè)置,因為已經(jīng)設(shè)置過了,但是如果關(guān)了窗口就要重新設(shè)置了

  5、設(shè)置編譯環(huán)境:./configure CC=arm-buildroot-linux-gnueabihf-gcc --host=arm-buildroot-linux-gnueabihf --build=x86_64-linux-gnu target=arm-buildroot-linux-gnueabihf --enable-shared --prefix=/home/libffi-3.2.1-target/libffi-target

  6、執(zhí)行編譯安裝:make && make install

  目前ctypes-build和ctypes-target也準備好了

十三、編譯python-build

  1、解壓源碼:tar xvf Python-3.5.2.tgz

  2、改名:mv Python-3.5.2 python-3.5.2-build

  3、cd /home/python-3.5.2-build

  4、修改 Modules/Setup.dist文件:vim Modules/Setup.dist

    a、修改關(guān)于openssl部分

    b、修改關(guān)于zlib部分

  5、將之前設(shè)置的交叉編譯器改為默認的編譯器:export CC= 這里=后面什么都不賦值就表示設(shè)置為空,這樣就會去找默認的gcc了

  6、設(shè)置編譯環(huán)境,./configure --prefix=/home/python-build --without-ensurepip

     --without-ensurepip:不安裝pip,因為默認安裝的pip版本太低了,所以一會我們自己安裝pip

  7、執(zhí)行安裝編譯:make && make install

  8、cd /home/python-build/bin

  9、下載pip文件:curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py -k

  10、安裝pip: ./python3 get-pip.py

  11、將該python-build添加到環(huán)境變量,設(shè)置為build主機上默認的python: export PATH=/home/python-build/bin:$PATH

  12、安裝Cython:pip3 install Cython

  13、測試:python3

十四:編譯python-targer

  1、解壓源碼包:tar xvf Python-3.5.2.tgz

  2、改名:mv Python-3.5.2 python-3.5.2-target

  3、cd python-3.5.2-target

  4、創(chuàng)建文件夾:mkdir /home/python-target

  5、將之前準備的openssl-targer、zlib-targer、cytpes-targer的頭文件和鏈接庫復制到/home/python-targer

    cp -rfp /home/zlib-1.2.11-target/zlib-target/* /home/python-target/

    cp -rfp /home/libffi-3.2.1-target/libffi-target/* /home/python-target/

    cp -rfp /home/openssl-1.0.2g-target/openssl-target/* /home/python-target/

  6、設(shè)置CFLAGS:CFLAGS="-I/home/python-target/include -I/home/python-target/include/python3.5m -L/home/python-target/lib"

  7、設(shè)置LDFLAGS:LDFLAGS="-L/home/python-target/lib"

  8、vim Modules/Setup.dist

  9、設(shè)置編譯環(huán)境:注意這里我為了方便看,手動的給每個參數(shù)換行了,實際使用中不應該換行的

./configure CC=arm-buildroot-linux-gnueabihf-gcc 
CXX=arm-buildroot-linux-gnueabihf-g++ 
AR=arm-buildroot-linux-gnueabihf-ar 
RANLIB=arm-buildroot-linux-gnueabihf-ranlib 
--host=arm-buildroot-linux-gnueabihf 
--build=x86_64-linux-gnu 
--target=arm-buildroot-linux-gnueabihf 
--disable-ipv6 
ac_cv_file__dev_ptmx=yes 
ac_cv_file__dev_ptc=yes 
--prefix=/home/python-target 
--without-ensurepip

  10、編譯:make HOSTPYTHON=/home/python-build/bin/python3 HOSTPGEN=/home/python-3.5.2-build/Parser/pgen

  11、執(zhí)行:make install HOSTPYTHON=/home/python-build/bin/python3

  目前位置我們就在build主機上已經(jīng)編譯好了python-build和python-target

十五、通過crossenv交叉編譯第三方庫例如:numpy

  1、在build主機上使用python-build搭建python-target的虛擬環(huán)境,然后再虛擬環(huán)境中打包python-target的第三方庫,這里以numpy為例:因為numpy是需要經(jīng)過交叉編譯才能使用的。

  2、cd /home/python-build/bin

  3、安裝crossenv:./pip3 install crossenv

  4、使用crossenv代表python-target的虛擬環(huán)境:./python3 -m crossenv --without-pip /home/python-target/bin/python3 cross_venv

  5、cd cross_venv/cross/bin

  6、激活虛擬環(huán)境:source activate

  7、curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py -k

  8、./python3 get-pip.py

  9、在cross_venv這個虛擬環(huán)境中的安裝Cython:./pip3 install Cython

  10、創(chuàng)建文件夾用來存放編譯后的第三方:mkdir /home/target_lib

  11、創(chuàng)建requestments.txt:vim requirements.txt 里面寫上numpy

  12、交叉編譯第三方庫成為.whl格式的安裝包:./pip3 wheel --wheel-dir /home/target_lib -r requirements.txt

  13、驗證:cd /home/target_lib

  14、注意,這里我們使用crossenv交叉編譯后的numpy第三方庫的后綴是linux_arm,而我們的目標板子是armv7l的,所以這里我們要手動的將

    numpy-1.18.5-cp35-cp35m-linux_arm.whl改為numpy-1.18.5-cp35-cp35m-linux_armv7l.whl。不然會報錯。這個坑,一直坑了我一個月的時間,嘗試了很多方法,不知道是編譯鏈的問題,還是編譯過程的問題。將交叉編譯后的numpy的.whl文件移植到目標板子的中,總是報錯,突然靈光一閃,就手動改個名字,居然可以了,這坑簡直是巨坑,坑了一個月的時間。

十六、移植到目標板子

  將編譯好的python-target打包 和 numpy-1.18.5-cp35-cp35m-linux_arm.whl(先不改名,移植到目標板子上在改名)移植到目標板子上

  1、壓縮python-target:tar cvf python-target.tar python-target

  2、通過ftp工具,將python-target.tar和numpy-1.18.5-cp35-cp35m-linux_arm.whl ,移植到目標板子的/home下

  3、解壓python-target:tar xvf python-target.tar

  4、cd /home/python-target/bin

  5、驗證在目標板子上運行python3

  6、驗證交叉編譯的第三方

    1、先下載pip:curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py -k

    2、安裝pip:./python3 get-pip.py

    3、配置pip源

      a、mkdir ~/.pip

      b、vi ~/.pip/pip.conf

      c、添加如下代碼

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple 
trusted-host = pypi.tuna.tsinghua.edu.cn

    4、驗證pip

    5、通過pip安裝未改名的numpy第三方庫:這是會報錯:numpy-1.18.5-cp35-cp35m-linux_arm.whl is not a supported wheel on this platform.

    6、改名:mv /home/numpy-1.18.5-cp35-cp35m-linux_arm.whl /home/numpy-1.18.5-cp35-cp35m-linux_armv7l.whl

     7、重新安裝驗證:        

到此python3及python需要的第三方庫,類似numpy這樣需要交叉編譯的第三方庫就完成了!其中其他庫不一定都是完全一樣的,但是大致流程是一樣的可以參考借鑒。

到此這篇關(guān)于python及第三方庫交叉編譯的文章就介紹到這了,更多相關(guān)python交叉編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python之生成多層json結(jié)構(gòu)的實現(xiàn)

    python之生成多層json結(jié)構(gòu)的實現(xiàn)

    今天小編就為大家分享一篇python之生成多層json結(jié)構(gòu)的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 詳解python中的json的基本使用方法

    詳解python中的json的基本使用方法

    本篇文章主要介紹了python中的json的基本使用方法,在Python中使用json的時候,主要也就是使用json模塊,json是以一種良好的格式來進行數(shù)據(jù)的交互,有興趣的可以了解一下。
    2016-12-12
  • 如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果

    如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果

    這篇文章主要給大家介紹了關(guān)于如何使用python的subprocess執(zhí)行命令、交互、等待、是否結(jié)束及解析JSON結(jié)果的相關(guān)資料,subprocess模塊提供了一種簡單的方法來創(chuàng)建和管理子進程,它可以讓我們在Python程序中執(zhí)行外部命令,獲取命令的輸出和錯誤信息,需要的朋友可以參考下
    2023-12-12
  • python如何實現(xiàn)多層級自動賦值字典

    python如何實現(xiàn)多層級自動賦值字典

    這篇文章主要介紹了python如何實現(xiàn)多層級自動賦值字典問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python anaconda安裝庫命令詳解

    Python anaconda安裝庫命令詳解

    這篇文章主要介紹了Python anaconda安裝庫命令詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • 手把手教你用python繪制熱度圖(heatmap)

    手把手教你用python繪制熱度圖(heatmap)

    我們在做諸如人群密集度等可視化的時候,可能會考慮使用熱力圖,在Python中能很方便地繪制熱力圖,下面這篇文章主要給大家介紹了關(guān)于用python繪制熱度圖(heatmap)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Python基礎(chǔ)之元組與文件知識總結(jié)

    Python基礎(chǔ)之元組與文件知識總結(jié)

    今天帶大家復習一下Python基礎(chǔ)知識,文中詳細介紹了Python元祖與文件,對正在學習python基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python自動操作Excel文件的方法詳解

    Python自動操作Excel文件的方法詳解

    大家平時在工作與學習中都會操作到Excel文件格式,特別是很多數(shù)據(jù)的時候,靠人力去識別操作非常容易出錯。今天就帶大家用Python來處理Excel文件,讓你成為一個別人眼中的秀兒
    2022-05-05
  • python實現(xiàn)XML解析的方法解析

    python實現(xiàn)XML解析的方法解析

    這篇文章主要介紹了python實現(xiàn)XML解析的方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細教程

    在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細教程

    使用os.system()這個方法簡單直接,但它不返回命令的輸出,只返回命令的退出狀態(tài),如果你只需要知道命令是否成功執(zhí)行,這個方法就足夠了,這篇文章主要介紹了在CentOS 7中使用Python 3執(zhí)行系統(tǒng)命令的詳細教程,需要的朋友可以參考下
    2024-02-02

最新評論