2014-07-22 5 views
7

libavcodec 및 libavformat에 정적으로 링크 된 정적으로 링크 된 실행 파일을 빌드하려고합니다./avcodec_alloc_context에 대한 정의되지 않은 참조가 ffmpeg 링커 순서가 맞습니까?

- 다음과 같이

./configure --enable-static --enable-gpl --enable-nonfree --disable-vaapi 
    --disable-libopus --prefix=myBuild --disable-swresample 

링커가 설정됩니다 : 컴파일 할 때

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
    -L/ffmpeg/myBuild/lib -lavformat -lavcodec -lavutil -lrt -lm -lpthread -lz 

, 나는 ONLY ONE 오류 메시지>를 얻을 수 정적는 FFmpeg 라이브러리로 구축했다

src/ffmpeg/myProgram.cpp:115: error: undefined reference to 'avcodec_alloc_context' 

출력 nm /ffmpeg/myBuild/lib/libavcodec.a | 그렙 avcodec_alloc_context :

  U avcodec_alloc_context3 
     U avcodec_alloc_context3 
000003c0 T avcodec_alloc_context3 
     U avcodec_alloc_context3 

나는 통근 "C"와 libavcodec.h을 포함 {} 그리고 내 정적 링커 순서가 올바른지 생각합니다. 이 오류가 발생하는 이유는 무엇입니까? 이 메소드가 사용되지 않으므로 사용 했습니까? 이 문제를 어떻게 해결할 수 있습니까?

해결책 :

망가 어쩌면 이전의 코드 조각에서

avCtx = avcodec_alloc_context() 

를 사용하지만, 내가 올바르게 기억

codec = avcodec_find_decoder(CODEC_ID_XYZ);//for completeness but should be the same as before 
avCtx = avcodec_alloc_context3(codec) 
+1

는'나노 /ffmpeg/myBuild/lib/libavcodec.a의 출력은 무엇입니까 -lavcodec

는 또한 링크 순서가 -lavutil -lavformat해야한다 | grep avcodec_alloc_context'? –

+0

나는 내 게시물 – user2212461

+0

에 출력을 추가했습니다 @PaoloBonzini 그게 뭔가 알려주나요? – user2212461

답변

6

대신 avcodec_alloc_context3 전화를 시도해 봤어 :

그래서 연결 명령은 같은 일을해야 하는가?

avcodec_alloc_context3을 호출 할 때 아무런 문제가 발생하지 않고 extradata를 할당 한 다음 avcodec_open2를 호출합니다.

+0

굉장한, 그것은 일했다!! 나는이 오래된 코드 스 니펫을 어디에서 가지고 왔는지 모른다. 그들은 어떤 시점에서 더 이상 사용되지 않는 버전을 제거 했습니까? – user2212461

+1

잘 작동하는 것이 좋습니다. 아마도 그들은 새로운 호출과 교환 할 수 없기 때문에 그것을 제거했을 것입니다. –

2

를 사용하여 우리는이 문제가 있었다 용액을이었다 libavcodec.a (전체 경로와 함께) 및 기타 ffmpeg 정적 라이브러리를 특별히 추가해야합니다. e g ++ 연결 단계. 이런 식으로 작동하는지 확인하십시오.

또한 라이브러리 순서가 중요합니다. 나는 더 이상 오래된 makefiels을 가지고 있지 않지만 아마도 libavutil이 목록의 첫 번째가되어야 함을 상기 할 수 있습니다.

g++ -O2 -static -o myBin myBin-myBin.o someotherlibraries.a 
/ffmpeg/myBuild/lib/libavutil.a 
/ffmpeg/myBuild/lib/libavformat.a 
/ffmpeg/myBuild/lib/libavcodec.a 
    -lrt -lm -lpthread -lz 
+0

절대 라이브러리 경로 관련 : 제안 된 방법이 아니며 -L 내부적으로 정확히 동일합니까? 어쨌든 차이는 없었습니다. 그리고 내가 사용하고있는 순서는 나의 경우에 올바른 것 같다. 질서가 의존성을 의미하지 않으며 거꾸로 읽습니까? – user2212461