1

rand()バイオニックの機能は、含めないと機能しないことがわかりましたstdlib.h

extern int rand(void);

static void foo()
{
    int a = rand();
}

int main()
{
  foo()
  return 0;
}

の結果glibc:
コンパイルが成功しました

の結果bionic:
コンパイルに失敗し ました

error: undefined reference to 'rand'    

bionicソースには、次の実装があります。

static __inline__ int rand(void) {
    return (int)lrand48();
}

なぜ機能するのに機能しglibcないのかbionic

4

2 に答える 2

2

glibc の rand() は、ライブラリにある「通常の」関数です。シンボルがコンパイラーから定義されていない (見つけられない) という警告が表示されているのではないかと思いますが、関数はライブラリーに存在するため、リンク・ステージはそれを見つけてリンクすることができます。

bionic の rand() はstatic inlineヘッダー ファイルに含まれています。つまり、ヘッダー ファイルがインクルードされない限り定義されていません。コンパイラはインクルードなしではそれを見つけることができず、リンカが解決できるどのライブラリにも存在しないため、コンパイルはリンク段階で失敗します。

于 2013-07-17T08:46:47.380 に答える
2

rand 関数のバイオニック ソースと glibc ソースを比較するだけで答えが得られます: https://github.com/android/platform_bionic/blob/master/libc/include/stdlib.hおよび http://sourceware.org/git /?p=glibc.git;a=blob;f=stdlib/rand.c;hb=glibc-2.15#l26

bionicライブラリではヘッダーファイルにインライン化されているため、ファイルがないと使用できないこと.hがわかります。また、glibcでは、ほとんどの関数と同様に分離されています。その理由は明らかだと思います-bionicライブラリは、メモリと速度の制限がある組み込みおよびモバイルデバイスで使用するために特別に開発されたため、コードとインラインの最適化が少なくて済みます。

于 2013-07-17T08:48:36.680 に答える