2012-03-29 24 views
4

私は根本のアンドロイドデバイスで実行するコマンドラインC++テストアプリケーション(実行可能ファイル)を作成しています。定義されていない参照エラー - rand

実行可能ファイルは、複数の事前ビルドされたCライブラリを使用し、そのうちの1つは 'rand()'を使用します。リンク状態の間、私はエラー "の定義されていない参照 'rand'"

パスが正しく設定されているかどうかを確認するには、

最初のアプローチ:テストソースでrand()を定義します。

私はみとめ定義エラーを取得することがわかり、最初の定義は、バイオニックにある/ libcのは、/は、/ STDLIB.H

第二のアプローチ:私は気付か

私のテストアプリケーションで使用しランド()リンカはここに未定義シンボル

第三のアプローチ文句ないこと:すべてのオブジェクトファイルアーカイブ解除済みおよびアーカイブ

未定義の参照エラーがまだ発生することがわかりました。

'rand'を使用するCライブラリをCテストファイルを使用して実行可能ファイルにコンパイルすると、前述のリンカエラーは表示されません。

私はあらかじめビルドされた静的ライブラリを変更することはできず、C++ベースのテストアプリケーションでライブラリを使用する必要があります。

すべての入力は大歓迎です。

+0

ライブラリは、 'unsigned int rand'の代わりに 'int rand'を返すようにrandが期待するように聞こえます。静的にリンクされている場合、なぜ 'ハック'を使用してテストCファイルをコンパイル/リンクするのですか? –

+0

randは標準のCモジュールであり、共有オブジェクトまたは実行可能ファイルの作成中にリンクされます。私に提供された静的ライブラリは、rand()呼び出しを使用し、その定義は含まれていません。 – Deepak

+0

私はシンボルのダンパーを調べることをお勧めします。私はrand()が何であるかを知っています。静的ライブラリがCライブラリが使用するものとは異なるバージョンに対してコンパイルされた可能性が高いことがわかります。あなたはこれをいくつかの方法でクリアすることができます(独自のrandを提供し、C randに 'ラッパー'を提供するなど)が、シンボルダンプをチェックするのが最善の方法です。また、http://stackoverflow.com/questions/4768180/rand-implementationに誘導します –

答えて

1

十分なので、コメントするポイント...

あなたはバイオニックのstdlib.hで見れば、あなたは(そのランドが表示されますが){

静的インライン int型のrand(無効)として定義されるわけではありません...}

つまり、関数の実際のコードはヘッダーファイルにあります。

これは、最初の方法で複数の定義エラーが発生する理由です。

同じ理由で2番目のアプローチが成功し、(関数がインラインであるため)オブジェクトファイルに「extern」参照が生成されず、ライブラリが検索されます。

次。あなたのC++コードは、libcまたはlibstdC++のいずれかとリンクします(チェックする必要があります)。あらかじめビルドされた静的ライブラリは、明らかにrand()のインライン実装を持たないstdlib.hに対してコンパイルされていました。

スタティックでLDD(またはreadelf)コマンドを実行し、探しているライブラリがプラットフォームにないことを確認する必要があります。ライブラリは、rand()シンボルをエクスポートしないbionicのものと同じ名前を持つ可能性が高いため、ローダは参照を解決できません。

これを修正するには、静的ライブラリを変更しないと、少なくとも静的ライブラリを再構築できますか?あなたのCテストファイルは、アンドロイド用に、あるいはネイティブでクロスコンパイルされていますか?

0

使用'android-ndk32-r10-windows-x86_64.zip'、ない'android-ndk64-r10-windows-x86_64.zip'

APP_ABI := armeabi armeabi-v7a x86 

3 APIが32ビットです。

関連する問題