Ошибка сборки, вызванная отсутствием библиотеки 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
все двоичные файлы были поставлены на место, и я смог успешно использовать его!