제임스딘딘의
Tech & Life

수행 프로젝트 이력/스마트폰을 이용한 감시시스템 [2011.09~ 2012.09]

[ffmpeg] NDK 를 이용해 안드로이드 용 library 빌드시 문제 : codec_names.h 누락

제임스-딘딘 2012. 9. 7. 15:46

ndk version : r8

ffmpeg version : 0.10.4

host os : windows 7

terminal : cygwin


참고 자료 : [Android NDK FFmpeg 컴파일 강좌 (4/4)]

 http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1646540


문제 내용

참고 자료를 통해 ffmpeg를 빌드하던 중 codec_names.h 를 찾지 못한다는 문제가 발생.


D:/Eclipse_Workspace_Android/FFmpegBasic/jni/ffmpeg/libavcodec/utils.c:1568:36: error: libavcodec/codec_names.h: No such file or directory

/home/JeonYoungHo/android-ndk-r8/build/core/build-binary.mk:240: recipe for target `/cygdrive/d/Eclipse_Workspace_Android/FFmpegBasic/obj/local/armeabi-v7a/objs/avcodec/utils.o' failed

make: *** [/cygdrive/d/Eclipse_Workspace_Android/FFmpegBasic/obj/local/armeabi-v7a/objs/avcodec/utils.o] Error 1





문제 원인

ffmpeg 빌드시 make 파일들을 쭉 따라가다보면 

ffmpeg/libavcodec 에 보면 codec_names.sh 파일이 존재한다. (헤더가 아닌, 쉘 스크립트 프로그램 파일임)

이 쉘 스크립트를 실행 하여 codec_names.h 를 생성하는 구조이다.


codec_names.h는 보통 ndk-build 명령을 통해 build 진행시 auto generate 된다. (make 파일들을 제대로 작성했다는 가정 아래)

어떤 이유인지는 모르겠지만 본인은 codec_names.h 가 자동 생성되지 않아서 build 가 진행되다가 멈추었다.


참조 자료를 따라하며 build 를 시도한다면, libavcodec 디렉토리에 

Makefile2 를 만들었을 것이고, 그것을 열어보면 
65번 line 부터
$(SUBDIR)codec_names.h: $(CODEC_NAMES_SH) config.h $(AVCODEC_H)
$(CC) $(CPPFLAGS) $(CFLAGS) -E $(AVCODEC_H) | \
$(CODEC_NAMES_SH) config.h $@

이런 내용이 있다.
이부분이 codec_names.h 를 자동 생성하는 부분이다. config.h 는 현재 디렉토리에서 찾게 되어있지만 상위 디렉토리에 있으므로 못 찾을 것이고.. 소스상에서도 수정이 약간 필요했다.


해결 방법

요약 : codec_names.sh 를 이용해 codec_name.h 를 수동으로 생성해준다.

구체적 방법 

ffmpeg/libavcodec 디렉토리에 위치한 상태에서 gcc를 통해 다음과 같이 실행.

$ gcc -DLIBAVCODEC_VERSION_MAJOR=53 -E avcodec.h | ./codec_names.sh ../config.h codec_names.h


에러가 날 것이다.

에러내용을 자세히 읽어보면 #include "경로/헤더파일" 의 상대경로/절대경로 문제이다.

에러난 파일을 vi로 열어서 경로를 상대경로로 지정해준다.

 예) In file included from ../libavutil/avutil.h:328,

                 from ../libavutil/samplefmt.h:22,

                 from avcodec.h:30:

../libavutil/common.h:38:32: libavutil/avconfig.h: No such file or directory

avcodec.h:457:36: libavutil/audioconvert.h: No such file or directory


avcodec.h 의 457라인에서 libavutil/audioconvert.h 를 찾을수 없다는 뜻.

avcodec.h 를 열어 457라인을 보면 #include "libavutil/audioconvert.h" 가 있을 것이다.

#include "../libavutil/audioconvert.h" 로 수정해준다. (각자 자신의 기준에서 수정할 필요가 있다)


이런식으로 몇개의 include 관련 에러가 발생하는데, 모두 유사한 방법으로 수정하고  $ gcc -DLIBAVCODEC_VERSION_MAJOR=53 -E avcodec.h | ./codec_names.sh ../config.h codec_names.h 를 다시 해보면 codec_names.h 가 정상적으로 생성될 것이다.

이후, ndk-build 를 통해 다시 진행하여 정상 빌드 되었다.

결론
에러내용을 꼼꼼히 읽고 차근차근 생각해서 잘하자