當前位置:首頁 » 編程軟體 » 交叉編譯armpython

交叉編譯armpython

發布時間: 2022-12-23 20:57:22

1. 本人對python一竅不通,出於好奇,將最新的python3.2交叉編譯弄到安卓上,憑借linux

你安裝時的目錄是否有改變? 提示說找不到相應的目錄了。

2. 深度linux的arm-linux-gnueabihf-gcc編譯參數如何配

一般來說,交叉編譯工具是用於在一種架構的主機(例如x86)上,編譯另一種主機(例如arm)運行的程序,在這個編譯期間,需要用到的頭文件/庫,往往需要從一個叫目標文件系統(sysroot)的路徑開始查找。

sysroot里包含usr,lib,usr/lib usr/include等文件夾結構和必要的頭文件和庫,你理解為目標機器上的整個文件系統,搬到你這台電腦上,然後作為一個文件夾存在。

交叉編譯原則上不能用主機(host)的頭文件,

  • 這首先是因為編譯器在查找頭文件的相對路徑時,交叉編譯器會配置為查找目標平台架構的位置,和主機的gcc不一樣,這也是為什麼它去arm-linux-gnueabihf這個目錄去尋找的原因。

  • 其次主機和目標機的系統版本有差異,再加上處理器架構的差異,往往有很多兼容性問題,甚至有難以解決的編譯錯誤。

  • 如果一定要用本機的頭文件系統來湊合,那麼需要把所有的-I都列出來,即不僅需要-I/usr/include,還需要-I/usr/include/xxx,甚至要創建一些文件夾的符號鏈接指向你主機的這些頭文件文件夾。即使這些,往往也未必成功,有些頭文件不同的系統架構,會不完全一樣甚至缺失。

交叉編譯一般無法使用主機的庫(so)文件

  • 主機和目標機往往架構不同,庫完全不能使用

  • 可能遇到主機和目標機架構相同的情況,比如你在intel64上編譯一套運行在intel64位手機的程序,但是庫兼容性的問題仍然存在。

最後結論:你這個問題,如果你是為了另一套機器(比如arm開發板編譯),那麼需要搞一套目標機的文件系統才能順利編譯。

對了,目標文件系統需要編譯了python和dev頭文件/庫,好多嵌入式設備裁剪的很厲害,都不用python。

3. Python交叉編譯失敗怎麼回事

1、在源碼 python2.7.3/Moles/Setup.dist 搜索zlib ,打開該模塊
2、繼續下去,又提示缺少zlib.h,也就是我們的交叉編譯庫中缺少zlib頭文件和庫文件
3、在http://www.zlib.net/ 下載zlib源碼,交叉編譯zlib
由於zlib 編譯不支持--host選項,所以在zlib目錄下執行如下命令
~/zlib1.2.8/# mkdir _install
~/zlib1.2.8/#CC=arm-xxxxx(你的交叉編譯器) ./configure --host=./_install(最好是絕對路徑,我偷懶了,這個是安裝目錄)
~/zlib1.2.8/# make && make install
你會在_install目錄下發現include 和 lib 目錄
下一步,我們回到第1步
為了防止交叉編譯鏈污染,我們在python目錄下創建otherinclude otherlib
把zlib下的include和lib下的內容分別按照對應名字拷貝過來
4.在Moles/setup 找到我們前面setup.dist那句話,添加 -L../otherlib -I../otherinclude 這個應該都懂的
直接make
5,如果你之前make distclean過了,沒有setup文件,請修改setup.dist.文件,重新configure!

4. 如何編譯可以在Windows下運行的帶有Python支持的ARM Linux GDB

距離上次我編譯這種GDB的時間轉眼過了3年,現在(2017年3月6日),Linaro編譯器已經支持python了。不過,當我們自己使用的時候還是有一些麻煩的,因為Linaro編譯器的sysroot和平時我們用的sysroot還是不一樣的,需要在gdbinit文件裡面用"set sysroot"或"set solib-search-path"之類設定路徑。生在獅子座長成座的我,是無法容忍這種麻煩的,所以還是自己來弄一次。
還是在Linux下做MinGW的交叉編譯,需要MinGW交叉編譯器。

因為Linaro已經做了很多事情了,源碼,expat,python都搞定了,資源如下:
Linaro GDB git:

從這上面找到與Linaro編譯器版本對應的源碼
編譯用的expat和python:

編譯的時候只需要設定一個環境變數:
export PYTHON_MINGW=/home/c/gdb-arm/python-2.7.4-mingw32
然後配置一下就行了:
./configure --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=/home/c/gdb-arm/expat-2.1.0-1 --without-libunwind-ia64 --without-libunwind-ia64 --without-lzma --with-python=/home/c/gdb-arm/python-2.7.4-mingw32 --without-guile --without-babeltrace --with-sysroot=/opt/sysroot-arm
然後就可以:
make
make DESTDIR= install

5. 在linux上交叉編譯wxPython的時候遇到的一個找不到鏈接庫的問題,求解答

你這個文件到底在什麼地方?
/usr/local/arm/gtkdfp/lib
下面怎麼還有帶目錄名的 /usr/lib/

把程序裝載稀奇古怪的地方,出現任何問題都是可能的。

6. 如何編譯可以在Windows下運行的帶有Python支持的ARM Linux GDB

做這件事情的目的是為了在QtCreator里調試ARM Linux程序的時候,能看清楚QString、QList這些Qt特有的對象的內容,而不是一個完全看不懂的結構體。
目前(2014年8月)Linaro、CodeSourcery的GCC工具鏈里的GDB都不支持Python。想知道你用的GDB支持不支持,試一試就行,這樣表示不支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Python scripting is not supported in this of GDB.
這樣表示支持:
(gdb) python
>print 'Hello GDB!'
>(按Ctrl+D)Hello GDB!
這件事情乍一看也很簡單,只要把GDB源碼下載下來,然後再配置,打開Python支持就行了。實際上會遇到的問題是,在MinGW下,又要與「\」和「:」這兩個Windows路徑里的刺頭斗爭了。我覺得我之前挺傻,編譯MinGW下Qt的時候,就去硬磕源碼和configure腳本去了。這次GDB的configure是自動生成的,不是給人看的,configure.ac看起來也很費勁,根本磕不下去,於是我換了個思路,在ubuntu下交叉編譯吧,sudo apt-get install mingw32,這是Ubuntu下的MinGW交叉編譯器。
然後是依賴,這樣的GDB要依賴expat和python的開發版本。如果是ubuntu底下直接編譯,apt-cache search一下他們的開發版本,然後sudo apt-get install一下就好了;給MinGW交叉編譯就麻煩了。先說expat,這個好辦,把http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz下載下來,然後:
./configure --prefix=[安裝目錄,如/home/c/mingw-gdb/expat] --host=i586-mingw32msvc
make
make install
會提示一些警告,無視即可。
Python就無語了,目前的GDB貌似最高支持Python 2.7,而2.7版本的Python本身不支持MinGW…… 好在有高手做了Patch,也寫了說明,可以參考這文章:http://mdqinc.com/blog/2011/10/cross-compiling-python-for-windows-with-mingw32/
但是,就算這樣,編譯也充滿挑戰,要修復很多問題,出來的Python還少「nt」模塊。就在我覺得沒辦法的時候,突然發現Windows版Qt提供的MinGW居然內置了Python開發包,位置在Tools/mingw48_32/opt,趕緊把它拷貝到Linux下,比如/home/c/mingw-gdb/python。當然,你也必須確保ubuntu下有可用的python。
然後,給GDB打一個補丁:
--- gdb-7.8/gdb/configure 2014-07-29 20:37:42.000000000 +0800
+++ gdb-7.8-old/gdb/configure 2014-08-30 00:08:27.122042706 +0800
@@ -8263,21 +8263,22 @@
# We have a python program to use, but it may be too old.
# Don't flag an error for --with-python=auto (the default).
have_python_config=yes
- python_includes=`${python_prog} ${srcdir}/python/python-config.py --includes`
+ python_config_tool=`echo ${python_prog} | sed "s#python.exe#python-config#g"`
+ python_includes=`${python_config_tool} --includes`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --includes" "$LINENO" 5
fi
fi
- python_libs=`${python_prog} ${srcdir}/python/python-config.py --ldflags`
+ python_libs=`${python_config_tool} --ldflags`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
as_fn_error "failure running python-config --ldflags" "$LINENO" 5
fi
fi
- python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix`
+ python_prefix=`${python_config_tool} --exec-prefix`
if test $? != 0; then
have_python_config=failed
if test "${with_python}" != auto; then
@@ -8343,12 +8344,12 @@
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+#if ac_fn_c_try_link "$LINENO"; then :
have_libpython=${version}
found_usable_python=yes
PYTHON_CPPFLAGS=$new_CPPFLAGS
PYTHON_LIBS=$new_LIBS
-fi
+#fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
CPPFLAGS=$save_CPPFLAGS
這個補丁的目的是強制為檢測到python。
然後給拷貝到Linux下的python開發包打一個補丁:
--- python-old/bin/python-config 2013-04-18 02:43:01.000000000 +0800
+++ python/bin/python-config 2014-08-30 00:53:16.630060288 +0800
@@ -1,4 +1,4 @@
-#!/temp/x32-480-posix-dwarf-r2/mingw32/opt/bin/python2.7.exe
+#!/usr/bin/python

import sys
import os
@@ -31,26 +31,23 @@

for opt in opt_flags:
if opt == '--prefix':
- print sysconfig.PREFIX
+ print '../python'

elif opt == '--exec-prefix':
- print sysconfig.EXEC_PREFIX
+ print '../python'

elif opt in ('--includes', '--cflags'):
- flags = ['-I' + sysconfig.get_python_inc(),
- '-I' + sysconfig.get_python_inc(plat_specific=True)]
+ flags = ['-I' + os.path.split(os.path.realpath(__file__))[0] + '/../include/python2.7']
if opt == '--cflags':
- flags.extend(getvar('CFLAGS').split())
+ flags += ['-fno-strict-aliasing -DMS_WIN32 -DMS_WINDOWS -DHAVE_USABLE_WCHAR_T -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes']
print ' '.join(flags)

elif opt in ('--libs', '--ldflags'):
- libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
- libs.append('-lpython'+pyver)
+ libs = ['-lm -lpython2.7 -Wl,--out-implib=libpython2.7.dll.a']
# add the prefix/lib/pythonX.Y/config dir, but only if there is no
# shared library in prefix/lib/.
if opt == '--ldflags':
if not getvar('Py_ENABLE_SHARED'):
- libs.insert(0, '-L' + getvar('LIBPL'))
- libs.extend(getvar('LINKFORSHARED').split())
+ libs.insert(0, '-L' + os.path.split(os.path.realpath(__file__))[0] + '/../lib/python2.7/config')
print ' '.join(libs)

因為Linux下是無法運行開發包中的python.exe的,所以這個補丁借用了ubuntu的python。裡面的cflags和ldflags都是在Windows底下運行原始python-config獲得的。prefix和exec-prefix設成「../python」,可以在編譯完以後,把python開發包拷貝到gdb安裝目錄裡面的python子目錄,這樣運行GDB的時候就不需要設定PYTHONHOME環境變數了。
最後一個事情,確保你的Linux下有arm交叉編譯器,我的是arm-linux-gnueabihf,是啥target就寫啥。
准備工作做完了,開始配置和編譯:
./configure --with-expat --host=i586-mingw32msvc --target=arm-linux-gnueabihf --with-libexpat-prefix=[expat安裝位置] --with-python=[python開發包安裝位置/bin/python.exe]
make
make DESTDIR=[GDB安裝位置] install
然後把GDB安裝位置下面的所有文件拷貝到Windows下,再把python開發包拷貝到同目錄下的python子目錄,大功告成。
如果提示沒找到libpython2.7.dll,那就把GDB安裝目錄的python/bin下的拷貝到bin下。
如果發現生成的exe文件太大了,那就strip一下。
2015年9月12日追加:
在windows下調試時,一般會提示說載入不了共享庫,讓你用"set sysroot"或"set solib-search-path"之類設定路徑的。這個問題可以通過.gdbinit文件,用上面這兩條命令來設定路徑解決,如果想一勞永逸,可以在編譯的時候加上host_configargs環境變數來解決這個問題:
host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm ./configure ...
或者
export host_configargs=--with-sysroot=E:\MinGW\opt\sysroot-arm
./configure ...

後面的路徑是你放在windows下的sysroot的位置。

7. 如何交叉編譯Python到ARMLinux平台 / 藍訊

步驟一:部署protoc.exe
1)sudo su ---進入管理模式
//以下操作切換至protobuf文件夾下
2)。/configure
3)make
4)make check
5)make install
此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯庫的運行環境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(這兩個參數在後續配置腳本需要用到,與後面腳步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0後綴「arm-apple-darwin12.3.0」保持一致)
6)make distclean清理已生成的makefile,為交叉編譯配置新makefile做准備

8. 有哪位大神嵌入式ARM中移植python的庫,求助啊

我沒弄過ubuntu下的graphics.py。
但是弄過windows下的。

1. apt是用來安裝Ubuntu系統的軟體的。
2. Python是Ubuntu下面的一個軟體。
3. 而graphics.py屬於python中的第三方庫函數。

所以,即使用apt,也是用apt去安裝,更新python。
而python中的庫,有自己的安裝方法。
常見的是直接 setup.py install或者用pip之類的去安裝。

具體安裝的方法,自己去參考這個:
【待完善】【總結】Python安裝第三方的庫、package的方法

(此處不給貼地址,請用搜標題,即可找到帖子地址)

9. 如何交叉編譯Python到ARM-Linux平台

編譯sqlite

先去 http://www.sqlite.org/download.html 下載最新的sqlite源代碼,我這里用的是3.5.6版本的。

我推薦使用amalgamation版本的源代碼,這個代碼只有幾個文件而已,編譯起來方便,而且據說 編譯器好的話,還可能編譯出更高效的代碼。 我下載的是

[plain]
view plain

http://www.sqlite.org/sqlite-amalgamation-3.5.6.tar.gz

先運行以下幾步:

[plain]
view plain

tar zxf sqlite-amalgamation-3.5.6.tar.gz
cd sqlite-3.5.6
./configure --host=arm-linux --prefix=/usr/local/arm/3.3.2 --enable-shared --disable-readline --disable-dynamic-extensions

以上是把sqlite解壓縮,然後做一些配置,這里,我希望sqlite到時候安裝到/usr/local/arm/3.3.2里,要生成動態鏈接庫,不要readline,不要sqlite的動態擴展。

然後編輯Makefile,把CFLAG和CXXFLAG中的-g去掉,我們不用debug sqlite。

接下來就可以編譯和安裝sqlite了:

[plain]
view plain

make
make install

這一步就完成了sqlite的編譯和安裝了。

編譯python

先去http://www.python.org/download/下載最新版本的python源代碼,我這里下載的是:

[plain]
view plain

http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tar.bz2

先把python解壓縮:

[plain]
view plain

tar jxf Python-2.5.1.tar.bz2
cd Python-2.5.1

編譯pc版本的語法解析器

由於在編譯python的時候,需要先編譯一個叫pgen的程序出來,用於生成語法解析器,所以我們要先生成一個pc版本的pgen:

[plain]
view plain

mkdir build.pc
cd build.pc
../configure
make Parser/pgen

然後ls Parser一下,應該就能看到有pgen了。

修改configure

configure在檢測編譯器的printf是否支持%zd的時候,如果發現是在cross compile,就直接不幹活了。這還了得?

把這一部分的檢測代碼去掉。這段代碼起始於

[plain]
view plain

echo "$as_me:$LINENO: checking for %zd printf() format support" >&5
echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6
if test "$cross_compiling" = yes; then

結束於

[plain]
view plain

cat >>confdefs.h <<\_ACEOF
#define PY_FORMAT_SIZE_T "z"
_ACEOF

else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

( exit $ac_status )
echo "$as_me:$LINENO: result: no" >&5
echo "${ECHO_T}no" >&6
fi
rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi

把這兩段以及中間的內容都刪除掉就可以了。

編譯arm版本的python

有了語法解析器,就可以開始編譯arm版本的python了。

[plain]
view plain

mkdir ../build.arm
cd ../build.arm
../configure --prefix=/home/leojay/test/arm-system-working/rootfs --disable-ipv6 --host=arm-linux --enable-shared

先創建一個用於編譯的目錄build.arm,再對python做一些配置,如安裝目錄,不要ipv6,使用arm-linux的編譯器,生成動態鏈接庫。

修改Makefile

之後就要對Makefile做一些修改,把

[plain]
view plain

OPT= -DNDEBUG -g -O3 -Wall -Wstrict-prototypes

一行中,去掉-g,我們不要debug python,-O3改為-O2,空間緊張O2就可以了。



[plain]
view plain

PGEN= Parser/pgen$(EXE)

一行的下面加上

[plain]
view plain

PGEN_HOST= ../build.pc/Parser/pgen$(EXE)

表明我們在HOST上運行的pgen

在要使用PGEN的地方改為PGEN_HOST:

[plain]
view plain

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改為:

[plain]
view plain

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

修改所有使用新生成的python的地方。

所有如 ./$(BUILDPYTHON) 的地方,都改為python

如:

[plain]
view plain

platform: $(BUILDPYTHON)
$(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

改為

[plain]
view plain

platform: $(BUILDPYTHON)
$(RUNSHARED) python -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform

這種地方比較多,大家小心修改。

修改setup.py

setup.py負責編譯python的各個擴展模塊。但是,由於python完全沒有考慮cross compile,所以要做一些修改。

PyBuildExt類:

函數的前兩行是把/usr/local加到搜索目錄中,我們的cross compiler一般不會直接安裝在 /usr/local裡面的,所以這兩行去掉:

[plain]
view plain

lib_dirs, inc_dirs的設定中,把中括弧里的那些都去掉。 以下所有模塊都不要:
這個函數在編譯了所有的extension後,會去load這些剛編譯好的extension, 但我們在i686的電腦上顯然不能load,所以要跳過這些操作。 在 build_ext.build_extension(self, ext)後面直接寫一個return,不做load。
for d in ['/usr/local/arm/3.3.2/include']
for d in inc_dirs + sqlite_inc_paths:
ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
build_extension函數:
detect_moles函數:
cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, imageop, rgbimg, readline,

[plain]
view plain

由於python本身的問題,現在ctypes還不能在除i386以外的機器上運行,所以ctypes也去掉 編譯sqlite的地方:

[plain]
view plain

改為:

[plain]
view plain

因為我的sqlite3安裝在這里,如果這里不改的話,setup.py會在我的電腦上找sqlite

main函數:
setup函數調用的時候,把要安裝的scripts那一部分去掉

之後就可以make && make install了。

附上我修改後的 Makefile 和 setup.py 供大家參考

裁減python

python完全安裝後,實在是很大,所以,要把一些肯定用不上的庫去掉。 所以,再附上我的裁減腳本 cleanpy.sh

注意,由於我的python程序都運行在python -OO的參數下,所有的.py和.pyc都不需要, 只要有.pyo就可以了。所以,這個腳本會把所有的.py和.pyc都刪除掉。

大家可以根據自己的需要做調整。

10. 如何交叉編譯Python到ARM-Linux平台

由於在編譯python的時候,需要先編譯一個叫pgen的程序出來,用於生成語法解析器,所以我們要先生成一個pc版本的pgen:
[plain] view plain
mkdir build.pc
cd build.pc
../configure
make Parser/pgen

然後ls Parser一下,應該就能看到有pgen了

熱點內容
交易貓買腳本靠譜嗎 發布:2025-07-17 11:32:27 瀏覽:519
伺服器系統盤一般做什麼陣列 發布:2025-07-17 11:16:05 瀏覽:362
如何用c語音實現放射密碼 發布:2025-07-17 11:13:03 瀏覽:734
lol腳本2017 發布:2025-07-17 10:52:18 瀏覽:826
編譯條件有哪些 發布:2025-07-17 10:42:51 瀏覽:333
apache設置靜態內容緩存時間 發布:2025-07-17 10:32:32 瀏覽:294
蘋果6不能緩存的視頻 發布:2025-07-17 10:31:44 瀏覽:404
如何把文件夾共享 發布:2025-07-17 10:23:49 瀏覽:298
linux查看命令大全 發布:2025-07-17 10:21:24 瀏覽:976
安卓應用程序和蘋果手機哪個好 發布:2025-07-17 10:20:43 瀏覽:411