Ошибка сборки, вызванная отсутствием библиотеки arc4random

в настоящее время я работаю над потоковой структурой и решил использовать ffmpeg для кодирования и / или декодирования моего видео и / или аудио.

поэтому я щелкнул https://ffmpeg.org для файлов api и загрузил статически связанную версию только для того, чтобы узнать, что она фактически содержит a .exe (я использую Windows в разработке, но планирую использовать Linux в производстве) вместо одной или нескольких dll и заголовков.

Так как я не думаю, что могу использовать "exe" в качестве замены dll я клонировал источник git и попытался скомпилировать его сам.

затем при компиляции я сталкиваюсь с этой ошибкой:

CC  libavutil/random_seed.o
libavutil/random_seed.c: In function 'av_get_random_seed':
libavutil/random_seed.c:130:12: error: implicit declaration of function 'arc4random' [-Werror=implicit-function-declaration]
     return arc4random();
            ^
cc1: some warnings being treated as errors
common.mak:60: recipe for target 'libavutil/random_seed.o' failed
make: *** [libavutil/random_seed.o] Error 1

насколько я могу судить, это означает, что мне не хватает библиотеки arc4random, поэтому я начал искать этот lib и не нашел абсолютно ничего, кроме того, что эта библиотека каким-то образом связана с Apple..., но нет dll и прочее или источники, чтобы скомпилировать его самостоятельно.

Я использую cygwin и его GCC для компиляции на 64-битном машина windows 7.

может ли кто-нибудь намекнуть мне на какое-то место, где я могу получить эту отсутствующую библиотеку или другую возможность получить ffmpeg в качестве библиотеки в мой проект? (Я бы предпочел что-то , что я могу связать статически, так как этот проект должен быть lib сам по себе)

может быть, есть способ использовать этот загруженный exe ffmpeg, так как я могу заимствовать его заголовки из источника, который я клонировал из Git?

любой намек оценил.

лучшие С уважением,

Яника Адам

1 ответов


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

открыть libavutil/random_seed.c искать #if HAVE_ARC4RANDOM, должно быть вокруг строки 129, и удалите этот блок из трех строк:

129 #if HAVE_ARC4RANDOM
130     return arc4random();
131 #endif

когда вы запустите make снова, вы, вероятно, получите еще один подобный сбой во времени.c для gettimeofday (), поэтому откройте libavutil/time.c искать #if HAVE_GETTIMEOFDAY который должен быть вокруг линии 41 и удалите первый блок там, вот так:

до изменения:

41 #if HAVE_GETTIMEOFDAY
42     struct timeval tv;
43     gettimeofday(&tv, NULL);
44     return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
45 #elif HAVE_GETSYSTEMTIMEASFILETIME

после изменения:

41 #if HAVE_GETSYSTEMTIMEASFILETIME

после этих двух изменений компиляция получила намного больше, но не удалась на ffserver.c:

ffserver.c: In function ‘main’:
ffserver.c:4000:5: error: implicit declaration of function ‘sigaction’ [-Werror=implicit-function-declaration]
     sigaction(SIGCHLD, &sigact, 0);

чтобы исправить эту ошибку, я открыл config.мак и добавил -D_XOPEN_SOURCE=700 до конца CFLAGS, например:

42 CFLAGS=   -std=c99 -fomit-frame-pointer -pthread  -g -Wdeclaration-after-statement -Wall -Wdisabled-optimization -Wpointer-arith -Wredundant-decls -Wwrite-strings -Wtype-limits -Wundef -Wmissing-prototypes -Wno-pointer-to-int-cast -Wstrict-prototypes -Wempty-body -Wno-parentheses -Wno-switch -Wno-format-zero-length -Wno-pointer-sign -O3 -fno-math-errno -fno-signed-zeros -Werror=format-security -Werror=implicit-function-declaration -Werror=missing-prototypes -Werror=return-type -Werror=vla -Wformat -fdiagnostics-color=auto -Wno-maybe-uninitialized -D_XOPEN_SOURCE=700

этот пост объясняет немного о том, почему -D_XOPEN_SOURCE=700 помогает.

тогда я побежал make снова и это, наконец, удалось. После запуска make install все двоичные файлы были поставлены на место, и я смог успешно использовать его!