2012-02-06 12 views
1

私はAndroid ADBシェルから実行したいC++ユーティリティープログラムを移植しようとしています。 そのために、私はAndroid NDKのmake-standalone-toolchain.shスクリプトを使用していて、自分のプログラムをコンパイルしています。 。私はこれがc_str関数は、NDKでのように、libstdC++の中に存在していないことを意味しているのを見、いくつかの研究の後Android adbシェルネイティブプログラムでstlを使用

reloc_library[1315]: 16304 cannot locate '_ZNKSs5c_strEv'... 
CANNOT LINK EXECUTABLE 

:私はそれを実行しようとする 残念ながら、私はこのエラーを取得します。私もstlport.soでシンボルを見つけることができず、実際には./sources/cxx-stl/gnu-libstdc++/libs/バージョンのC++ライブラリでしか見つかりませんでした。これらのライブラリは、私が作ったスタンドアローンのツールチェーンには含まれておらず、デバイス上でも見つかりませんでした(デバイスはHoneycombを実行しています)。

NDKのテキストには、stlportを使用するとSTL全体がサポートされていることが明確に記載されています。これはアイスクリームサンドイッチでのみ正しいことですか? libstlport.soまたはlibsupC++。soのデバイスとNDKには、見つからなかったような署名はありませんでした。

だから私の質問は二つの部分ました:私は、ビルドプロセス/ Androidのセットアップに欠けている何かが

  1. をありますか?プログラムをgnu-libstC++を必要とせずにコンパイルできるように、あるいは少なくともデバイスにロードするのではなく、コンパイル/リンクエラーで失敗するように、設定を変更することはできますか?
  2. gnu-libstC++とのリンクが唯一の方法であれば、どうすればいいですか?私はそれに静的にリンクを管理することができると思うが、私はむしろそうしたくない。他の誰かが解決策を探している場合は

どのように私は私の

+0

STL実装(静的stlportまたは静的gnustlなど)を選択するには、Application.mkファイルのAPP_STL変数を使用します(docs/CPLUSPLUS-SUPPORT.htmlファイルを参照)。 –

+0

残念ながら私はスタンドアロンのツールチェーンを使用しているので、私はそれを行うことができません。一般に私はアクティビティをコンパイルしませんが、adbシェル(psやcpに似ています)で実行する予定のLinuxプログラム – nitzanms

+0

次に、ndk-buildがSTL実装を選択する方法を調べます(特定のCFLAGSとLDFLAGSを選択します)。スタンドアロンのツールチェーンに同じコンパイラとリンカーのフラグを選択すれば、静的なSTLライブラリを選択することができます。 –

答えて

0

にGNU-のlibstdC++バージョンを追加することができ、私はlibgnustl_shared.soに-lスイッチを使用して依存関係を追加することになりました。私は、デバイスにプログラムして.soが一緒にこれを押して、LD_LIBRARY_PATHにカレントディレクトリを追加するスクリプトを作っ

sources/cxx-stl/gnu-libstdc++/libs/&ltarchitecture>/

でNDKの内側にそれを見つけることができます。 makeスクリプトを使ってgnustlに依存するプログラムを作成したときのNDKの動作と似ています。

関連する問題