0

Linux を BUILD システムとして使用し、Google の android-ndk をツールチェーンとして使用し、最終的に次のコマンドを実行するカスタム スクリプトを使用して、Android 用の http Mongoose サーバーをクロスコンパイルしました。

arm-linux-androideabi-gcc -DANDROID -march=armv7-a -mfpu=neon \
  -mfloat-abi=softfp -mvectorize-with-neon-quad \
  -I /opt/android-ndk-r9d/platforms/android-19/arch-arm/usr/include \
  -I ~/Package_sources/BUILD_arm-linux-androideabi/include \
  -DMONGOOSE_USE_LUA -DMONGOOSE_USE_LUA_SQLITE3 \ 
  -L/opt/android-ndk-r9d/platforms/android-19/arch-arm/usr/lib \
  -L~/Package_sources/BUILD_arm-linux-androideabi/lib \
  -L~/Package_sources/BUILD_arm-linux-androideabi/lib -lluasqlite3 \
  server.c mongoose.c -o server -llua51 -lm

スクリプトはエラーなく正常に動作し、最終的な「サーバー」elf 実行可能ファイルが作成されます。私が今抱えている問題は、Androidで起動しようとするときです。"floor" のような数学記号 (libm で定義) が見つからないと文句を言います。それらがコンパイル時に見つかるのに実行時に見つからない理由がよくわかりませんが、Android のクロスコンパイルと次に説明するコンパイルのセットアップについて疑問があります。

  • クロスコンパイルするために選択したいくつかのオプション/フラグは、すべての (数千の) gcc オプションを完全に理解していないため、任意であり、さまざまなフォーラムで人々が提案するものを選択しました。特に -mfloat-abi=softfp、-mfpu=neon、および -mvectorize-with-neon-quad

  • また、システムにインストールされている最新の platform/android-19 も任意に選択しました。Android-「N」バージョンの違いと、どちらかを選択することの意味は正確にはわかりません(最新のものを選択する方が安全ですか、最も古いものを選択する方が安全ですか?または、それぞれに異なるものを選択する必要があります別のデバイス/ターゲット?)

  • また、任意に gcc-4.6 arm-linux-androideabi-gcc ビルドを選択しました。android-ndk には gcc-4.8 もインストールされています。好みはありますか、それとも最終的なターゲットに依存しますか? (あるいは関係ないかもしれません)

ヘルプ、ヒント、またはリンクを事前にありがとうございます!

4

1 に答える 1

0

最後に、問題の原因は LUA ライブラリ (-DLUA_USE_DLOPEN) のコンパイル フラグの欠落であったようです。これにより、ソフトウェアは正しくコンパイルされましたが、実行時にロードに失敗したため、シンボルが「他の場所」で定義されていました。

于 2014-09-14T17:18:30.283 に答える