Python 交叉編譯

2021-10-01 15:06:32 字數 2626 閱讀 2913

情況說明

自己想要在windows 虛擬機器ubuntu18.04 中編譯python直譯器,以移植到arm平台上執行,主要目標是在arm qemu中進行執行。

編譯環境:ubuntu 18.04

編譯器:gcc, arm-linux-gnueabi

python版本:2.7.3 和 3.5.5

整個過程分為三個步驟

編譯生成當前平台該版本的python

給低版本python2.7.3 打上交叉編譯的補丁,其中高版本python沒有交叉編譯的補丁(忘記在哪篇文章看到過這句話,囧)

交叉編譯生成目標機arm上的python

進入python原始碼目錄,執行

./configure
編譯當前平台該python版本對應的python和parser/pgen

( 原始碼根目錄下生成 python 可執行檔案, parser/目錄下生成pgen 可執行檔案)

make python parser/pgen
將當前平台對應的python 可執行檔案備份為python_for_build

mv python python_for_build
將當前平台的pgen可執行檔案備份為pgen_for_build

mv parser/pgen parser/pgen_for_build
清理當前原始碼目錄下編譯好的專案檔案(清除makfile等相關檔案),為交叉編譯生成目標平台的python檔案做準備

make distclean
低版本python2.7.3 是有交叉編譯補丁的。根據tolimit的部落格,以下版本是有補丁的,其他版本不確定。自己只針對python2.7.3 進行補丁驗證。鏈結部分失效,需要的話,請自行google。

進入python原始碼目錄,執行

patch -p1 < python-2.7.3-xcompile.patch
顯示如下,則表示打補丁成功

配置

cc為指定c交叉編譯器,我的是arm-linux-gnueabi-gcc

cxx為指定c++交叉編譯器,我的是arm-linux-gnueabi-g++

ar為ar工具,我的是arm-linux-ar

ranlib為ranlib工具,我的是arm-linux-gnueabi-ranlib

host為目標主機,我這裡設定的是arm-linux-gnueabi

build為編譯環境主機,我的是x86_64-linux-gnu

prefix為安裝位置

我的整個配置命令如下:

cc=arm-linux-gnueabi-gcc cxx=arm-linux-gnueabi-g++ ar=arm-linux-gnueabi-ar ranlib=arm-linux-gnueabi-ranlib ./configure --host=arm-linux-gnueabi --build=x86_64-linux-gnu --prefix=/home/hui/cross_compile/python-arm/
編譯hostpython指定我們之前編譯的python檔案

hostpgen指定我們之前編譯的pgen檔案

我的整個編譯命令如下:

make hostpython=./python_for_build hostpgen=./parser/pgen_for_build bldshared="arm-linux-gnueabi-gcc -shared" cross_compile=arm-linux-gnueabi- cross_compile_target=yes hostarch=arm-linux-gnueabi buildarch=x86_64-linux-gnu
安裝

make install hostpython=./python_for_build bldshared="arm-linux-gnueabi-gcc -shared" cross_compile=arm-linux-gnueabi- cross_compile_target=yes prefix=/home/hui/cross_compile/python-arm
最後在prefix 指定的目錄下會有新生成的檔案和資料夾,主要資料夾是/bin, /include, /lib, /share。 把他們複製到目標機器/usr 目錄下(qemu arm可能需要配置環境變數 export path=$path:/usr/lib/)。最後,在目標機器上執行以下命令檢查python環境是否完整。

python /usr/lib/python2.7/test/test___all__.py

# 必須鍵入完整絕對路徑

編譯 交叉編譯

交叉編譯含義 是指在乙個平台上生成另乙個平台上的可執行 同乙個體系結構可以執行不同的作業系統,同樣乙個作業系統也可以在不同的體系結構上執行 例 常說的x86 linux平台 指inter x86體系結構及linux for x86作業系統 x86 winnt平台 指inter x86體系結構及win...

python 交叉編譯到ARM

1.交叉編譯需要,先編譯pc版python 再編譯arm出來,用於生成語法解析器 configure make parser pgen2.配置 和編譯 export cc arm openwrt linux gcc configure host arm openwrt linux prefix ho...

Python 2交叉編譯

ubuntu osubuntu bin ls arm linux gnueabi addr2line arm linux gnueabi cpp arm linux gnueabi gcc ar arm linux gnueabi gfortran arm linux gnueabi objdump...