2016-05-02 50 views
9

Obecnie pracuję nad frameworkiem strumieniowania i zdecydowałem się użyć ffmpeg do kodowania i dekodowania mojego wideo i/lub audio.Błąd kompilacji spowodowany przez brakującą bibliotekę arc4random

Więc kliknąłem przez https://ffmpeg.org dla plików api, i pobrałem wersję statycznie połączoną tylko aby dowiedzieć się, że faktycznie zawierała .exe (używam systemu Windows w opracowaniu, ale planuję używanie Linuksa w produkcji) zamiast jednego lub więcej informacje o dll i nagłówku.

Ponieważ nie sądzę, mogę użyć "exe" jako zamiennika dla biblioteki dll, sklonowałem źródło git i próbowałem samemu je skompilować.

Następnie podczas kompilacji i napotkasz ten błąd:

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 

O ile mogę powiedzieć, to znaczy, że jestem brakuje arc4random biblioteki, więc zacząłem szukać tego lib i znalazł absolutnie nic, poza faktem, że ta biblioteka jest w jakiś sposób powiązana z Apple ..., ale nie ma dll i innych rzeczy lub źródeł do samodzielnego skompilowania.

Używam cygwin i jego GCC do kompilacji na 64-bitowym Windows 7 Machine.

Czy ktoś może mi wskazać lokalizację, w której mogę uzyskać tę brakującą bibliotekę, lub jakąś inną możliwość pobrania ffmpeg jako biblioteki do mojego projektu? (Wolę coś, co mogę połączyć statycznie, ponieważ projekt ten ma być samodzielną biblioteką)

Może istnieje sposób, w jaki mogę wykorzystać pobrany plik exe ffmpeg, ponieważ mogę pożyczyć jego nagłówki od źródło, które sklonowałem od Gita?

Każda uwaga została doceniona.

Pozdrawiam,

Jannik Adam

+0

czy zainstalowałeś pakiet 'cygwin-devel'? – matzeri

+0

@matzeri tak, wersja 2.5.1-1 – Omega1001

+0

Mam ten sam błąd. Jedyną potencjalną przydatną informacją, którą znalazłem, były łatki dla arc4random.c, nie wiem, czy łatki wymagają zastosowania przed kompilacją. –

Odpowiedz

7

Wydaje się to być spowodowane tym, że #if jest nieprawidłowo donosi, że system ma tę funkcję. Udało mi się go obejść, edytując kilka plików.

Otwarte libavutil/random_seed.c i szukać #if HAVE_ARC4RANDOM, powinna wynosić około 129 linii i usunąć ten blok z trzech linii:

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

Po uruchomieniu zrobić ponownie prawdopodobnie będziesz dostać inną podobną awarię w time.c dla gettimeofday(), więc otwarte libavutil/time.c i szukać #if HAVE_GETTIMEOFDAY która powinna wynosić około 41 linii i wyjąć pierwszy blok tam coś takiego:

Przed zmianą:

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 

Po zmianie:

41 #if HAVE_GETSYSTEMTIMEASFILETIME 

Po tych dwóch zmianach kompilacji ma dużo dalej, ale nie na 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); 

Aby naprawić ten błąd, że otwarte config.mak i dodał -D_XOPEN_SOURCE=700 do końca flagami, tak:

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 

This post wyjaśnia trochę o tym, dlaczego -D_XOPEN_SOURCE=700 pomaga.

Potem ponownie uruchomiłem make i ostatecznie się udało. Po uruchomieniu make install wszystkie pliki binarne zostały wprowadzone i mogłem z powodzeniem z nich korzystać!

+0

Dla mnie rozwiązanie działało bez zmian w pliku time.c – porsh

+0

to konfiguracja wykrywająca HAVE_ARC4RANDOM tutaj w błędzie, lub co powoduje początkowy problem, zastanawiam się ... – rogerdpack