Функция 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
Библиотека была разработана специально для использования во встраиваемых и мобильных устройствах с ограничением памяти и скорости, поэтому полезна меньшая часть кода и встроенные оптимизации.