android - rand() 函数仿生与 glibc

标签 android gcc random glibc bionic

我发现 bionic 的 rand() 函数在不包含 stdlib.h 的情况下无法工作

extern int rand(void);

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

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

glibc 的结果:
编译成功

仿生的结果:
编译不成功

error: undefined reference to 'rand'    

bionic 源中,我们有以下实现:

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

为什么它适用于 glibc 但不适用于 bionic

最佳答案

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

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

关于android - rand() 函数仿生与 glibc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17694875/

相关文章:

android - 如何删除Android应用程序中的数据库

java - 使用谷歌地图 V2 在多段线中绘制箭头

c - 如何关闭来自 gcc 的错误浮点/长错误消息

c++ - 使用 gcc 编译的静态库中未解析的符号

python - 在python中生成一个随机的非质数

language-agnostic - 实时生成(泊松?)随机变量

javascript - 使用 php(?) 在每个服务器日随机增加数值

android - 火力地堡 Firestore : Is there a callback when there is no internet connection?

android - 单击操作按钮后如何在不打开应用程序的情况下消除通知?

c++ - 为什么 clang 仍然需要 libgcc.a 来编译我的代码?