欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

這篇文章主要介紹“python中第三方庫(kù)交叉編譯問(wèn)題怎么解決”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“python中第三方庫(kù)交叉編譯問(wèn)題怎么解決”文章能幫助大家解決問(wèn)題。

創(chuàng)新互聯(lián)公司2013年成立,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元豐南做網(wǎng)站,已為上家服務(wù),為豐南各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

一、前言:

網(wǎng)上關(guān)于python的交叉編譯的文章很多,但是關(guān)于python第三庫(kù)的交叉編譯的文章就比較少了,而且很多標(biāo)題是第三方庫(kù)的交叉編譯,但是實(shí)際上用到的都是不需要交叉編譯就能用的庫(kù),可參考性不強(qiáng)。

二、交叉編譯介紹:

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

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

三、python及其第三方庫(kù)的交叉編譯背景

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

2、目標(biāo)板子(target主機(jī)):armv7l

3、執(zhí)行交叉編輯的主機(jī)(build主機(jī)):ubuntu18-x86_64

4、python版本:3.5.2

5、numpy==1.18.5

四、交叉編譯的準(zhǔn)備工作

build主機(jī)是我新安裝的一個(gè)ubuntu18的新虛擬機(jī),所以連gcc 都沒(méi)有的 

1、安裝gcc:sudo apt-get install gcc-8 -y

2、將gcc-8指定成默認(rèn)的gcc: sudo ln -s /usr/bin/gcc-8 /usr/bin/gcc

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

3、安裝cmake: sudo apt-get install make cmake -y

4、安裝libffi-dev 交叉編譯 python 需要的依賴(lài):sudo apt-get install libffi-dev

5、安裝zip 解壓壓縮包使用:sudo apt-get install zip -y

五、交叉編譯python及其第三方的思路

1、在build主機(jī)上交叉編譯zlib庫(kù),這個(gè)是python源碼安裝必須的依賴(lài)庫(kù)

2、在build主機(jī)上交叉編譯openssl庫(kù),這個(gè)雖然不是源碼安裝必須的依賴(lài)庫(kù),但是大部分其他庫(kù)都有可能使用到這個(gè)庫(kù)

3、在build主機(jī)上安裝build主機(jī)上的python版本,我們成為python-build

4、在build主機(jī)上交叉編譯target主機(jī)上的python版本,我們稱(chēng)之為python-target

5、在build主機(jī)上通過(guò)crossenv搭建target-python的運(yùn)行虛擬環(huán)境

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

六、準(zhǔn)備交叉編譯工具

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

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

登錄后復(fù)制

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

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

2、進(jìn)入 host 目錄: cd host

3、執(zhí)行 relocate-sdk.sh 指令:./relocate-sdk.sh?。ú皇撬薪徊婢幾g鏈都需要這一步的)

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

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

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

7、測(cè)試:arm-buildroot-linux-gnueabihf-gcc -v

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

七、準(zhǔn)備openssl-build

這里我已經(jīng)準(zhǔn)備好了openssl-1.0.2g.tar.gz的壓縮包,這里我嘗試了openssl-1.1.1的版本,但是和python3.5.2不太合適,總是有問(wèn)題,所以這里我使用的是openssl-1.0.2的版本

1、解壓源碼包,這些源碼包我都是放在/home路徑下的:tar -xzvf openssl-1.0.2g.tar.gz

2、對(duì)壓縮包進(jìn)行重命名,區(qū)分是在build主機(jī)上用的還是在target主機(jī)上用的,在build主機(jī)上用的我都統(tǒng)一在后面加上_build,在target主機(jī)上使用的統(tǒng)一在后面加上_target

mv openssl-1.0.2g openssl-1.0.2g-build

登錄后復(fù)制

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 此時(shí)在/home/openssl-1.0.2g-build里面就會(huì)有openssl-build文件夾

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

6、因?yàn)榘惭b的ubuntu18中默認(rèn)的openssl是1.1.1,我們需要換成我們的openssl-1.0.2g

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

把以前的備份: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、測(cè)試:openssl version ,已經(jīng)變成1.0.2g版本了

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

八、準(zhǔn)備openssl-target

1、同樣是再次解壓openssl源碼包,這次解壓的源碼包用來(lái)交叉編譯給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

解釋?zhuān)簄o-asm :加上no-asm 表示不使用匯編代碼加速編譯,不然會(huì)報(bào)錯(cuò)

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

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

5、在編譯后生成的Makefile中有兩處是 -m64 的標(biāo)記要?jiǎng)h除,因?yàn)榻徊婢幾g后是在32位的板子上運(yùn)行,所以這一步也要改:sed -i 's/-m64//' Makefile

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

目前我們就把openssl-build和openssl-target都準(zhǔn)備好了

九、準(zhǔn)備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

十、準(zhǔn)備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 通過(guò)export 設(shè)置的環(huán)境變量都是臨時(shí)一次性的,當(dāng)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準(zhǔn)備好了

十一、準(zhǔn)備ctypes-build

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

十二、準(zhǔn)備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 如果這一步在準(zhǔn)備zlib-target沒(méi)有關(guān)閉shell窗口的時(shí)候,可以不用設(shè)置,因?yàn)橐呀?jīng)設(shè)置過(guò)了,但是如果關(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也準(zhǔn)備好了

十三、編譯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部分

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

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

--without-ensurepip:不安裝pip,因?yàn)槟J(rèn)安裝的pip版本太低了,所以一會(huì)我們自己安裝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主機(jī)上默認(rèn)的python: export PATH=/home/python-build/bin:$PATH

12、安裝Cython:pip3 install Cython

13、測(cè)試:python3

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

十四:編譯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、將之前準(zhǔn)備的openssl-targer、zlib-targer、cytpes-targer的頭文件和鏈接庫(kù)復(fù)制到/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

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

./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

登錄后復(fù)制

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ī)上已經(jīng)編譯好了python-build和python-target

十五、通過(guò)crossenv交叉編譯第三方庫(kù)例如:numpy

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

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這個(gè)虛擬環(huán)境中的安裝Cython:./pip3 install Cython

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

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

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

13、驗(yàn)證:cd /home/target_lib

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

14、注意,這里我們使用crossenv交叉編譯后的numpy第三方庫(kù)的后綴是linux_arm,而我們的目標(biāo)板子是armv7l的,所以這里我們要手動(dòng)的將

numpy-1.18.5-cp35-cp35m-linux_arm.whl改為numpy-1.18.5-cp35-cp35m-linux_armv7l.whl。不然會(huì)報(bào)錯(cuò)。這個(gè)坑,一直坑了我一個(gè)月的時(shí)間,嘗試了很多方法,不知道是編譯鏈的問(wèn)題,還是編譯過(guò)程的問(wèn)題。將交叉編譯后的numpy的.whl文件移植到目標(biāo)板子的中,總是報(bào)錯(cuò),突然靈光一閃,就手動(dòng)改個(gè)名字,居然可以了,這坑簡(jiǎn)直是巨坑,坑了一個(gè)月的時(shí)間。

十六、移植到目標(biāo)板子

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

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

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

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

4、cd /home/python-target/bin

5、驗(yàn)證在目標(biāo)板子上運(yùn)行python3

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

6、驗(yàn)證交叉編譯的第三方

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

登錄后復(fù)制

4、驗(yàn)證pip

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

5、通過(guò)pip安裝未改名的numpy第三方庫(kù):這是會(huì)報(bào)錯(cuò):numpy-1.18.5-cp35-cp35m-linux_arm.whl is not a supported wheel on this platform.

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

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

7、重新安裝驗(yàn)證:      

python中第三方庫(kù)交叉編譯問(wèn)題怎么解決

關(guān)于“python中第三方庫(kù)交叉編譯問(wèn)題怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

網(wǎng)站名稱(chēng):python中第三方庫(kù)交叉編譯問(wèn)題怎么解決
網(wǎng)站URL:http://aaarwkj.com/article12/pjcgdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、標(biāo)簽優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、微信小程序、外貿(mào)建站、App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
日韩不卡在线免费播放| 蜜臀视频网站在线观看| 夜夜高潮夜夜爽免费观看 | 99精品国产高清一区二区三区| 久久91亚洲精品中文字幕| 免费视频观看在线一区二区三区 | 日本福利影院在线观看| 福利福利视频一区二区| 国产日韩精品一区二区在线 | 蜜臀av午夜福利在线观看| 亚洲国内一区二区三区| 一区二区三区深夜福利| 神马免费午夜福利剧场| 日韩视频看看色网站| 欧美一区二区三区情色| 亚洲国产日本一区自拍| 国产精品伦一区二区三级| 国产日本福利在线综合网| 色在色在线播放亚洲中文| 91香蕉伊人综合久久麻豆| 国产黄片一区二区不卡| 午夜影院免费在线观看五分钟| 国产亚洲一线二线三线| 西西美女掰开阴让你看| 国产饥渴熟女在线三区| 久久国产精品成人av| 精品综合亚洲中文字幕| 欧美十八一区二区三区| 老湿机午夜十分钟视频| 国产91在线视频播放| 中字幕人妻一区二区三区| 日本一级特黄大片做受在线观看| 98热这里只有精品视频| 欧美人与性禽动交情品| 国产精品自产拍在线网站| 青草草草草草在线观看| 成人亚洲理论片在线观看| 国产精品免费视频一区二区三区| 日韩欧美短视频在线观看| 国产精品一区二区三区日本| 亚洲黄色成人免费观看|