Функция rand() Bionic vs glibc

Я нашел это 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 ответа

Решение

rand() из glibc - это "нормальная" функция, расположенная в библиотеке. Я подозреваю, что вы получаете предупреждение о том, что символ не определен компилятором (который не может его найти), но, поскольку функция существует в библиотеке, стадия связи все еще может найти и связать ее.

Rion Bionic () является static inline в заголовочном файле это означает, что он даже не определен, если только заголовочный файл не включен. Поскольку компилятор не может найти его без включения, и он не существует ни в одной библиотеке, из которой компоновщик может разрешить его, компиляция завершится неудачей на этапе компоновки.

Вы получите ответ, если просто сравните бионический и glibc-источники функции rand: 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

Вы можете увидеть это в bionic библиотека это встроено в заголовочный файл, так что без .h Файл, который вы не можете использовать. И в glibc он отделен, как и большинство функций. Причина очевидна, я думаю - bionic Библиотека была разработана специально для использования во встраиваемых и мобильных устройствах с ограничением памяти и скорости, поэтому полезна меньшая часть кода и встроенные оптимизации.

Другие вопросы по тегам