rand()函数Bionic vs glibc

时间:2013-07-17 08:31:45

标签: android gcc random glibc bionic

我发现,如果不包含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

2 个答案:

答案 0 :(得分:2)

glibc的rand()是一个位于库中的“普通”函数。我怀疑你收到的警告是关于没有从编译器定义的符号(找不到它),但由于函数存在于库中,链接阶段仍然可以找到并链接到它。

bionic的rand()在头文件中是static inline,这意味着除非包含头文件,否则它甚至都没有定义。由于编译器在没有include的情况下找不到它,并且它不存在于链接器可以解析它的任何库中,编译将在链接阶段失败。

答案 1 :(得分:2)

如果你只是比较rand函数的仿生和glibc来源,你会得到答案:https://github.com/android/platform_bionic/blob/master/libc/include/stdlib.hhttp://sourceware.org/git/?p=glibc.git;a=blob;f=stdlib/rand.c;hb=glibc-2.15#l26

您可以在bionic库中看到它在头文件中内联,因此如果没有.h文件,则无法使用它。而在glibc中,它与大多数函数一样是分开的。原因很明显我认为 - bionic库是专为在具有内存和速度限制的嵌入式和移动设备中使用而开发的,因此更少的代码和内联优化是有用的。