armv7-architecture を使用して、Python 3 アプリケーションを組み込み Linux (Yocto) マシンにデプロイしようとしています。パッケージが限られているため、raspberry pi (同じ armv7 アーキテクチャを使用) で cx-freeze を使用してスタンドアロン ファイルを作成しています。作成したバイナリ ファイルをターゲット マシンで実行しようとすると、ソースが別のプラットフォーム用にコンパイルされたことを示すエラーが表示されます。
root@target:/media/sda/dist# ./helloworld
-sh: ./helloworld: No such file or directory
この実行可能ファイルはビルド マシンで動作します。
file-command の出力を、ターゲット マシンで実行される別のアプリケーションと比較しました。
これは動作しないファイルです:
root@target:/media/sda/dist# file helloworld
helloworld: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=99b2ae19f1e65dc26b6fd7d8b1dbc83f974830bd, stripped
そして、これはターゲット マシンで動作する別のバイナリです。
root@target:/usr/bin# file demo-application
demo-application: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, BuildID[sha1]=bd6660c43d9e98c59dfa8b16eb26277aa4f19949, stripped
唯一の違いは、最低限必要なカーネル バージョンのようですが、uname は実際のバージョンが 3.0.35 であることを示しています。
root@target:/media/sda/dist# uname -a
Linux Target-Machine 3.0.35-Yocto-21.0-r5061-0-svn2437 #1 PREEMPT Fri Jun 19 21:40:10 CEST 2015 armv7l GNU/Linux
ラズベリー pi ビルド マシンの uname 出力:
pi@raspberrypi ~/py/helloworld $ uname -a
Linux raspberrypi 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l GNU/Linux
ここで何が間違っていますか?実際の python コードや依存関係の問題ではないはずです。1 行のコードを含む非常に単純な helloworld アプリケーションで試してみました。
編集
ビルド マシンでの ldd コマンドの出力 (nuitka で作成された exe):
pi@raspberrypi ~/py/helloworld/helloworld.dist $ ldd helloworld.exe
/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0x76faf000)
libdl.so.2 => /home/pi/py/helloworld/helloworld.dist/./libdl.so.2 (0x76fa4000)
libpython3.2mu.so.1.0 => /home/pi/py/helloworld/helloworld.dist/./libpython3.2mu.so.1.0 (0x76ccf000)
libstdc++.so.6 => /home/pi/py/helloworld/helloworld.dist/./libstdc++.so.6 (0x76bfd000)
libm.so.6 => /home/pi/py/helloworld/helloworld.dist/./libm.so.6 (0x76b8c000)
libgcc_s.so.1 => /home/pi/py/helloworld/helloworld.dist/./libgcc_s.so.1 (0x76b64000)
libc.so.6 => /home/pi/py/helloworld/helloworld.dist/./libc.so.6 (0x76a33000)
/lib/ld-linux-armhf.so.3 (0x76fbc000)
libz.so.1 => /home/pi/py/helloworld/helloworld.dist/./libz.so.1 (0x76a15000)
libexpat.so.1 => /home/pi/py/helloworld/helloworld.dist/./libexpat.so.1 (0x769ec000)
libpthread.so.0 => /home/pi/py/helloworld/helloworld.dist/./libpthread.so.0 (0x769cd000)
libutil.so.1 => /home/pi/py/helloworld/helloworld.dist/./libutil.so.1 (0x769c2000)
編集2
nuitka
以下を使用して、Python コードをコンパイルし、スタンドアロン アプリケーションを作成しようとしました。
nuitka --standalone --recurse-all helloworld.py
これにより、コンパイルされたすべてのライブラリ ファイル (.so) と共に実行可能な helloworld.exe ファイルが生成されます。ただし、ターゲット マシンでこれを実行しようとすると、次のようになります。
root@target:~/helloworld/helloworld.dist# ./helloworld.exe
-sh: ./helloworld.exe: No such file or directory
残念ながら、パッケージが見つからないため、ターゲット マシンでldd
orコマンドを実行できません。readelf
編集3
いくつかのライブラリが本当に不足しているようです。実験目的で、ld-linux-armhf.so.3 を raspi から組み込みシステムにコピーしたところ、別のエラーが表示されました (別のライブラリが見つかりません)。別の問題は、組み込みシステムがソフトフロートを使用しているのに対し、ラズベリーパイがハードフロート (armhf) を使用していることだと思います。これをこのように機能させることはできないと思います。
EDIT 4 私は現在別のプラットフォームとOSを使用していますが、すべてが機能しているため、質問は私には関係ありません。