안녕하세요 ^^
두번째 강좌로 configure 과정에 대해 자세히 알아보겠습니다.
5. configure
옵션이 길어서 바로 명령을 입력하면 오류가 나기 쉬우니 파일을 하나 만듭니다.
ffmpeg 폴더에 config.sh 파일을 만들어 아래와 같이 작성합니다.
export ANDROID_ROOT=/cygdrive/c/my-android-toolchain ./configure --target-os=linux \ --arch=arm \ --enable-cross-compile \ --cc=$ANDROID_ROOT/bin/arm-linux-androideabi-gcc \ --cross-prefix=$ANDROID_ROOT/bin/arm-linux-androideabi- \ --extra-cflags="-marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon" \ --extra-ldflags="-Wl,--fix-cortex-a8" \ --disable-doc \ --disable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-avdevice \ --disable-network \ --disable-devices \ --disable-filters
여기서 맨 첫 줄의 ANDROID_ROOT 값은 자신이 standalone toolchain을 설치한 폴더로 수정합니다.
cygwin 스타일로 폴더 이름을 적어야 합니다.
참고:
여기서 cygwin 스타일로 쓰라는 말은
c:/my-android-toolchain 가 아닌 /cygdrive/c/my-android-toolchain 로 경로명을 사용해야 한다는 뜻입니다.
참고:
"--arch=arm"과 "--enable-cross-compile"이 arm CPU 용으로 cross compile 하겠다는 옵션입니다.
"--cc"나 "--cross-prefix"에 cross compile 할 때 사용할 compiler에 관한 정보를 줍니다.
"--extra-cflags"나 "--extra-ldflags"는 neon 사용할 때 쓰는 옵션입니다. (c:/android-ndk-r5b/docs/STANDALONE-TOOLCHAIN.html 참조)
나머지는 ffmpeg에서 이러이러한 기능은 빼고 컴파일 하겠다는 뜻입니다. 예를들어 network 이런 기능은 필요없겠지요? ^^
configure 과정에서 사용될 임시 폴더를 만듭니다.
c:/ffmpegtmp 로 만듭니다. (그냥 윈도우 탐색기에서 적당히 폴더 하나 만들면 됩니다)
ffmpeg 폴더의 configure 파일에서 아래와 같은 부분을 찾습니다.
# set temporary file name : ${TMPDIR:=$TEMPDIR} : ${TMPDIR:=$TMP} : ${TMPDIR:=/tmp}
이 부분을 다음과 같이 수정합니다.
# set temporary file name TEMPDIR="c:/ffmpegtmp" TMP="c:/ffmpegtmp" : ${TMPDIR:=$TEMPDIR} : ${TMPDIR:=$TMP} : ${TMPDIR:="c:/ffmpegtmp"}
참고:
configure 파일을 분석해 보시면 아시겠지만
configure 마지막에 직접 간단한 소스 파일을 컴파일 해서 제대로 컴파일이 되는지 테스트 하는 과정이 있습니다.
이 때 "c:/ffmpegtmp" 임시 폴더가 사용됩니다.
configure를 최대한 수정하지 않고, 오류없이 깔끔하게 진행하기 위해 위와 같은 과정을 거치도록 합니다.
cygwin에서 g:/Root/FFmpegBasic/jni/ffmpeg 폴더로 이동한 후에 아래와 같이 configure를 실행합니다.
$ ./config.sh
WARNING은 한 두개 뜨지만 별다른 오류 없이 잘 실행이 될 것입니다.
생성된 config.h 파일을 열어봅니다.
#define ARCH_ARM 1
#define HAVE_ARMV5TE 1 #define HAVE_ARMV6 1 #define HAVE_ARMV6T2 1 #define HAVE_ARMVFP 1
#define HAVE_NEON 1
위와 같은 설정들이 잘 되어 있음을 확인할 수 있으실 겁니다.
config.h 파일에서 아래와 같은 부분을 찾습니다.
#define restrict restrict
다음과 같이 바꿔줍니다.
#define restrict
config.sh 파일은 첨부드리니 참고하시기 바랍니다.
다음 강좌에서는 본격적으로 Application.mk와 Android.mk를 작성해 보겠습니다. ^^
답변 감사드립니다.
제가 빌드할땐 컴파일 오류가 없어서, 해당 디파인을 왜 해제하는지에 대해 이유를 잘모르겠더군요.
neon을 적용했을때, 갤럭시 s는 무난하게 동작하는데 비해, 갤럭시 s2는 h264에서 장시간 플레이시 죽는 문제가
종종 나와서 확인하고 있었습니다.
마켓에 올라온 다른 비디오 플레이어에서도 이 문제가 나오더군요.
링크해주신 글을 참고했을 때, 이 옵션이 문제가 될 수도 있다는 생각이 듭니다.
도움을 주셔서 다시 한번 감사드립니다
안녕하세요.
강좌를 잘 읽고있습니다.
FFMPEG을 이용해서 실시간 스트리밍을 구현해 보려하는데..
config.sh에서 막혀서 난감해 하고 있습니다.
porting 작업은 이번이 처음이라 그런지 많이 낫설게 느껴집니다.
FFMPEG 0.8과 Android NDK r6를 사용하고 있습니다. 마찬가지로 cygwin을 windows 환경에 설치하였고요.
그런데 .config.sh를 실행하면 명령을 찾을 수 없다고만 하니 답답합니다.
조언 부탁드립니다.
저도 config.sh에서 막히네요.
$ ./config.sh
/cygdrive/c/android_toolchain/bin/arm-linux-androideabi-gcc is unable to create
an executable file.
C compiler test failed.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "config.log" produced by configure as this will help
solving the problem.
config.log를 열어보니까 다음과 같이 나오네요
...
zmbv_decoder_select=zlib
zmbv_encoder=yes
zmbv_encoder_select=zlib
WARNING: /cygdrive/c/android_toolchain/bin/arm-linux-androideabi-pkg-config not
found, library detection may fail.
mktemp -u XXXXXX
uEw17M
check_ld
check_cc
BEGIN /cygdrive/c/ffmpegtmp/ffconf.h3deEjrX.c
1 int main(void){ return 0; }
END /cygdrive/c/ffmpegtmp/ffconf.h3deEjrX.c
/cygdrive/c/android_toolchain/bin/arm-linux-androideabi-gcc -marm -march=armv7-a
-mfloat-abi=softfp -mfpu=neon -c -o /cygdrive/c/ffmpegtmp/ffconf.xUreG66c.o /cy
gdrive/c/ffmpegtmp/ffconf.h3deEjrX.c
arm-linux-androideabi-gcc.exe: /cygdrive/c/ffmpegtmp/ffconf.h3deEjrX.c: No such
file or directory
arm-linux-androideabi-gcc.exe: no input files
C compiler test failed.
무엇이 문제일까요?
VISTA 사용자입니다.
에러의 원인은 요약해서 이넘입니다.
arm-linux-androideabi-gcc.exe: /cygdrive/c/ffmpegtmp/ffconf.h3deEjrX.c: No such file or directory
configure 과정에서 컴파일러가 잘 돌아가는지 테스트해보려고
"임시 파일 만들기 -> 임시 파일 이용해 컴파일 테스트" 요런 단계를 거치는데,
임시 파일 만들기를 실패해서 그렇습니다.
일단 먼저 c:\ffmpegtmp 임시 폴더를 만드셨는지 확인해보시기 바랍니다.
폴더를 안 만들어 놓고 config를 돌리면 저렇게 될 수도 있습니다.
지금 확인해보니까
/cygdrive/c/android_toolchain/bin/arm-linux-androideabi-gcc -c /cygdrive/c/ffmpegtmp/test.c는 컴파일 안되고
/cygdrive/c/android_toolchain/bin/arm-linux-androideabi-gcc -c test.c 는 컴파일이 잘되네요.
그래서 ffmpegtmp 폴더를 c밑에 안만들고 ffmpeg 루트 소스 디렉토리(즉 로컬) 밑에 만들었고
configure 수정하는것도 로컬 디렉토리로 바꿔줬더니 잘 실행되는것 같네요.
아마도 제가 cygwin을 잘못 깔았거나 ndk를 잘못깔은게 아닐까 생각되네요.
로컬로 바꿔줘야 하는 부분
# set temporary file name
TEMPDIR="ffmpegtmp"
TMP="ffmpegtmp"
: ${TMPDIR:=$TEMPDIR}
: ${TMPDIR:=$TMP}
: ${TMPDIR:="ffmpegtmp"}
config.sh 파일에서 문제가 나는 것을
이 파일을 유닉스(linux) 포맷으로 저장해야하는데요.
그냥 윈도우에서 저장하면 줄바꿈이 다르기 때문에 나오는 것이랍니다.
유닉스는 \n 을 줄바꿈으로 사용하고,
윈도우는 \r\n 을 줄바꿈으로 사용해서
cygwin 이 모르는 \r 이 들어가 있다는 에러 랍니다.
그러므로, 편집기 중에 이 2가지 포맷 저장을 지원하는 것으로 유닉스 형 txt 파일로 저장하시면 된답니다.
울트라에디터나 acroedit (무료) 사용하시면 저장이 가능하답니다.
또는 위 config.sh 에 2라인의 실명 명령어 이므로 이것을 전부 2라인으로 만들어서 저장해서 사용하는 방법도 있습니다.
아크로에디터 사이트
같은 오류 였는데
my-android-toolchain을 /home/계정ID/로 옮기고
config.sh에서
ANDROID_ROOT=/home/계정ID/my-android-toolchain
로 바꿔서 됐습니다.
./configure --target-os=linux --arch=arm --enable-cross-compile --cc=/cygdrive/d/OpenSource/AndroidStandAloneToolChain/bin/arm-linux-androideabi-gcc --cross-prefix=/cygdrive/d/OpenSource/AndroidStandAloneToolChain/bin/arm-linux-androideabi- --extra-cflags="-marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon" --extra-ldflags="-Wl,--fix-cortex-a8" --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-avdevice --disable-network --disable-devices --disable-filters
이런식으로 한줄로 때려 박아서 해결했네요..왜 안되지..ㅠㅠ D 드라이브에 해서 그런가..그건 아닌거 같고..
계속 케리지리턴이 먹는거 같아서 한줄로 하고 export 사용을 못해서 패스도 다 명령어에 넣었더니 되게 길어지네요 ^^
맥에서는 그냥 되더만.. 윈도에서는 이상하게 안되네요..
저도 윗분들 처럼 permission denied도 나고 여러 문제가 있었지만,
toolchain의 permission을 보니 -------- 더라구요 @_@;
그래서 chmod 755 주니 config.h 생성되고, config.mak 파일이 만들어지네요..
이제 한고비 넘긴듯 합니다.
질문이 있습니다.
$ ./config.sh
Unable to create temporary file in ffmpegtmp.
config.log를 보면
WARNING: /cygdrive/C/my-android-toolchain
/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.
mktemp -u XXXXXX
IPlxXY
Unable to create temporary file in ffmpegtmp.
라고 나오는데 문제가 뭔가요 ㅠㅠ? 댓글들 보고 이거 저거 다해봤는데 안되네요 ㅠㅠ
도움 부탁드립니다
ffmpeg 0.8 버전이 아니면 ./config.sh 이후에 config.h파일 안에 ' #define restrict restric'라는 구문이 나오질 않습니다.
꼭 이 강좌대로 하실려면 0.8버전 이여야 합니다. 0.8.7도 안되더군요.
RESTRICT 키워드가 최적화라고 해버리면, 코드의 최적화로 들리기 때문에,
바로 잡자면, restricted 로 정의된 변수에 대해, 현재 사용하는 함수에서는, 이 변수가 독립적인거다 라고 컴파일러에게 알려주는 겁니다.
이게 효과가 뭔가하니, pointer 변수의 경우, 포인터를 얻어와서, 다른 넘이 혹시 쓰는 넘인가 하고.. 체크를 하게 되는데..
이과정을 생략해 주는 겁니다.. 난 독립적인넘이니깐..
그래서, 동작중에 좀 더 빠르겟죠..
그리고, 위에 말씀하신 분,, 컴파일 에러난다라는 분이 계셨던데..
#define restrict restrict
restrict 키워드는 standard가 아닙니다. c++에서
gcc에서는 사용하는 거구요...
만약 에러가 나신다면,,
#define restrict __restrict
or
#define restrict __restrict__
하심 됩니다..
강좌대로 따라왔는데
./configure: line 440: syntax error near unexpected token `$'{\r''
'/configure: line 440: `print_config_mak(){
./config.sh를 하면 이렇게 오류가 뜨네요
그리고 리눅스가 /r을 인식못해서 그렇다고해서 엔터쳐있는걸 지우고 다시 실행하면
또 그다음줄에서 저런오류가 뜨고 ㅠㅠ..
어떻게해결해야하나요;;;
permission denied 문제로 하루를 헤멨네요..
win7 64bit / ffmpeg는 0.8.12 환경이었습니다.
c드라이브에 있는 cygdrive/home/사용자명/temp 폴더는 chmod로 권한을 줘도 인식이 안되더군요.
결국 e드라이브에 temp 폴더 하나 만들고 chmod 777 cygdrive/e/temp 로 해결했습니다.
저 같은 경우 ./config.sh 하면 제일 마지막에 이 에러가 뜨면서 종료되는데 어떻게 해결하는지 아시는분 있나요?
저같은 경우는 config.sh실행시 c compiler test failed로 나와서 config.log를 확인하니 아래와 같이 에러가 .. -mcpu= 옵션은 어떻게 추가해야 하나요?
/cygdrive/c/android-toolchain/bin/arm-linux-androideabi-gcc -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon -mcpu= -E -o ffmpegtmp/ffconf.oMtPOSTF.o ffmpegtmp/ffconf.2rrEc7pW.c
arm-linux-androideabi-gcc.exe: error: missing argument to '-mcpu='
저는 아래와 같은 에러로... 안되네요...
ffmpegtmp폴더도 만들었는데 왜 이런 걸까요 ?
맥입니다.
Hongsungjunui-MacBook-Pro:ffmpeg hongsungjun$ ./config.sh
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc is unable to create an executable file.
C compiler test failed.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "config.log" produced by configure as this will help
solving the problem.
Hongsungjunui-MacBook-Pro:ffmpeg hongsungjun$
로그 파일은
END /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.goXeRHOP.c
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon -E -o /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.qjgCC7XV.o /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.goXeRHOP.c
check_ld cc
check_cc
BEGIN /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.goXeRHOP.c
1 int main(void){ return 0; }
END /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.goXeRHOP.c
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc -marm -march=armv7-a -mfloat-abi=softfp -mfpu=neon -march=armv7-a -c -o /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.qjgCC7XV.o /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.goXeRHOP.c
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc -Wl,--fix-cortex-a8 -o /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.ExgNPyY2 /var/folders/8t/gk5ft7ts7lq4fb28mbqg42fm0000gn/T//ffconf.qjgCC7XV.o
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtbegin_dynamic.o: No such file or directory
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot open crtend_android.o: No such file or directory
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lc
/Users/hongsungjun/Documents/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: cannot find -ldl
collect2: ld returned 1 exit status
C compiler test failed.
C Compiler test fail
이 에러로 구글에 검색해본결과 우리나라 뿐만 아니라 전세계 많은 분들이 고통을 겪으시는 걸로 확인했습니다.
해결책도 정말 무긍무진했지만 구글 검색후 3페이지 정도 되는 내용을 전부 해봤는데 해결이 안되더라구요.;;;
저같은 경우 아직도 이유는 정말 모르겠지만...
극단의 조치로 toolchain을 재설치 하니까 빌드가 되었습니다;;;;
혹시 아시는분은 조언을 부탁드립니다.
아 또한 이렇게 빌드시 마지막에
License: LGPL version 2.1 or later
Creating config.mak, config.h, and doc/config.texi...
./configure: line 1225: cmp: command not found
./configure: line 1225: cmp: command not found
요런 말이 나와서 지금 이거때문인가 안드로이드에서 빌드가 안되는데 혹시 아시는분 계신가여?
$ ./config.sh 명령했을때 아래 에러나시는 분들...
/cygdrive/d/my-android-toolchain/bin/arm-linux-androideabi-gcc is unable to create an executable file.
C compiler test failed.
12시간째 헤매다 드디어 해결했는데요.
저의 경우는 권한문제일거라고 생각은 해봤지만 d/my-android-toolchain 에 아무리 오른쪽 클릭 권한설정해도 안되었는데
$ chmod 777 -R /cygdrive/d/my-android-toolchain
이렇게 명령어로 해당폴더에 권한을 주고나서 하니까 되었어요...아 눈물이..누군가에게도 도움이 될까 하여 올려봅니다.
컴파일 마지막부분에 이런경고가떴는데 신경안써되는지요
WARNING: /cygdrive/d/cygwin/home/Administrator/android-toolchain/bin/arm-linux-a ndroideabi-pkg-config not found, library detection may fail.
저같이 삽질하는 분들이 없어야하기에요..
윈도우7+cygwin+android-ndk-r10e+ffmpeg-3.0조합입니다
ffmpeg 라이브러리를 빌드할때
1. config.sh에서 경로를 /cygdrive/c/my-android-toolchain같이 절대 경로를 쓰리고 했는데..
이렇게하면 절대 안됩니다.
C:/my-android-toolchain과 같이 쓰시던지..
'cygpath -m /cygdrive/c/my-android-toolchain'과 같이 한번 변환을 해줘야합니다.
2. temp directory 설정도 위와 마찬가지입니다.
더 추가되는 사항은 C나 D 드라이브 바로 아래에 temp라는 이름으로 만들면 폴더가 리드온리로만 설정이 되는 것 같아서..
cygwin 아래의 tmp 폴더를 이용했습니다.
설치 버전에 따라 c:/cygwin/tmp 혹은 c:/cygwin64/tmp 중 하나이고..
'cygpath -m /tmp'를 하면 /tmp라는 절대 경로의 위치를 알아서 반환해줍니다.
저같은 경우는 config.sh 파일 내부에 이 3가지 변수를 설정했습니다.
3. configure 파일에서 TEMPDIR 설정하는 부분을 수정해야합니다.
(만약 config.sh에서 설정했다고 하면 주석처리라도 해줘야합니다
안그러면 나중에 실행되는 configure 스크립트 파일의 내용으로 설정이 될꺼니까요.)
4. configure에서 링크파일을 만드는 부분을 수정합니다
ln -s -f로 된 부분이 하나있는데..
cygwin에서 리눅스의 링크 파일을 정확하게 그현을 못해주기 때문에 cp -f로 그냥 복사하는걸로 교체합니다.
5. 링크 파일 문제의 연장선인데...
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
↓
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
SLIB_INSTALL_LINKS='$(SLIBNAME)'
6. static 빌드는 문제가 없지만 shared 빌드의 경우 링크파일 문제가 생깁니다.
config.log 파일을 참조해서 libxxx/libxxx.so라는 링크 파일을 삭제하고 libxxx/libxxx.so.nn이라는 라이브러리 피일을 복사해서 libxxx/libxxx.so라고 바꿉니다.
그리고 계속 make를 수행하다 끝나면 make install을 해주면 됩니다
ffmpeg 관련하여 공부하던 중, 강좌를 보게 되어 매우 기쁩니다. 강좌를 보다가 궁금한 점이 있어 질문드립니다. #define restrict restrict 를 restrict로 수정하는 내용인데요. 구글링을 해보아도 단순히 그렇게 바꾸라고만 되어있지, 이걸 수정하지 않으면 어떤 버그가 생겨서 바꾸는거다라는 그런 설명이 없더군요. 혹시 해당 내용에 대해 약간 설명을 부탁드려도 될지요? neon 관련하여 갤럭시s2에서 문제가 있어 여러가지 테스트를 하고 있는데, 혹시 이게 실마리가 될수 있을지도 몰라 염치불구 질문드립니다.