總有很多原因夭坪,需要在非x86平臺下跑python。
python 交叉編譯
python的交叉編譯網(wǎng)上有不少帖子过椎,講的都很好室梅,這里就不在多說,放兩個鏈接
http://ljgabc.github.io/2015/04/24/2015-04-24-%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91Python-3-4-2/
http://xiaoxia.org/2013/09/13/python-on-tomato/
lxml的交叉編譯
lxml這類第三方庫疚宇,底層采用了C語言寫擴展亡鼠。如果需要lxml在非X86平臺上正確運行,那就需要將C語言擴展(xxx.so)編譯成對應平臺的二進制文件敷待。
一般來說间涵,直接在對應平臺上編譯安裝即可。But榜揖,如果對應平臺上內(nèi)存太小勾哩、處理器太慢、空間太少或者說根本沒有編譯器.....(其實就是說的嵌入式)
好吧举哟,還是安心的交叉編譯lxml吧
依賴庫
lxml 依賴于 libxml2 思劳、libxslt
首先把它兩給編譯了,安裝一個指定路徑MYPREFIX
腳本里的MY[xxx]
請指定對應的交叉編譯工具
lxml
./configure \
--host=\
--build=x86_64 \
--prefix=${MYPREFIX} \
--enable-shared=no \
--without-python \
LDFLAGS="-L${MYPREFIX}/lib" \
CFLAGS="-fPIC" \
CC=${MYCC} \
CXX=${MYCXX} \
STRIP=${MYSTRIP} \
AR=${MYAR} \
RANLIB=${MYRANLIB} \
READELF=${MYREADELF}
make -j && make install
libxslt
./configure \
--host=mips64-linux \
--build=x86_64 \
--prefix=${MYPREFIX} \
--enable-shared=no \
--disable-shared --with-libxml-prefix="${MYPREFIX}" --without-debug --without-python --without-crypto\
LDFLAGS="-L${MYPREFIX}/lib" \
CFLAGS="-fPIC" \
CC=${MYCC} \
CXX=${MYCXX} \
STRIP=${MYSTRIP} \
AR=${MYAR} \
RANLIB=${MYRANLIB} \
READELF=${MYREADELF}
make -j && make install
lxml 交叉編譯
還是先上腳本
CC=${MYCC} \
LINKCC=${MYCC} \
BLDSHARED="${MYCC} --shared -fPIC" \
LDSHARED="${MYCC} --shared -fPIC" \
LDFLAGS=' -Wl,-rpath,${MYPREFIX} -L${MYPREFIX}/lib -Wl,--gc-sections -llzma' \
/usr/local/bin/python3 setup.py build_ext -lrt --include-dirs=${MYPREFIX_PYTHON}//include \
--library-dirs=${MYPREFIX_PYTHON}/lib --force build \
--force build_scripts --executable=${MYPREFIX_PYTHON}/python \
--force bdist_egg --dist-dir ${DESTDIR} \
--with-xslt-config=${MYPREFIX}/bin/xslt-config
/usr/local/bin/python3
是host python妨猩,必須和target python的版本一致 敢艰,要不出了事不負責
${MYPREFIX_PYTHON}
是target python 編譯安裝的根目錄
${DESTDIR}
編譯的結果文件生成路徑
LDFLAGS CC
:一般交叉編譯都會指定的編譯工具或選項
大約就是這樣了
在深入了解下
python 不懂交叉編譯
為什么要指定 LINKCC BLDSHARED LDSHARED
,這是啥册赛?
這三個變量來自于 host python的 /usr/local/lib/python3.6/_sysconfigdata_m_XXXXXXXXX.py
在編譯 build_ext 的時候钠导,python的主要工具類是 Extension (from distutils.core import setup, Extension) ,這個類可以配置ext們的include/src/宏定義/等等一系列東西森瘪,它使用你配置的CC BLDSHARED
等變量覆蓋_sysconfigdata.py里的內(nèi)容牡属,然后進行編譯
LINKCC BLDSHARED LDSHARED
這三個變量會指定鏈接,動態(tài)庫鏈接時使用的編譯器默認全都是 gcc
................................ :<
所以在編譯lxml時只指定CC是沒用的,因為 LDSHARED 還會被使用
推廣一下扼睬, 以后第三方庫交叉編譯時可能還需要手動指定 _sysconfigdata.py 中的其他變量
GGGL