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() 是位于库中的“普通”函数。我怀疑您收到有关未从编译器定义的符号(找不到它)的警告,但是由于该函数存在于库中,因此链接阶段仍然可以找到并链接到它。

仿生的 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 回答