다음은 mpeg4ip가 gcc/g++ 4.4에서 빌드되도록 하기 위해 빌드 오류를 수정한 내역에 대한 설명이다. 작성된 패치 및 적용하는 방법은 “mpeg4ip-1.5.0.1을 ubuntu 12.04에서 컴파일 하기 1“를 참고.
bootstrap script 수정
bootstrap command를 수행하면 configure를 수행해 주는데 다음과 같은 에러가 나온다.
mpeg4ip-1.5.0.1$ ./bootstrap --disable-player dir: . SDL appears to be installed ./bootstrap: 77: ./bootstrap: Syntax error: Bad fd number
faac까지 모두 설치되고 ldconfig를 수행한 상태이므로 faac가 잘 동작하는 상태라고 가정하고 다음 부분을 comment-out 한다.
if test $target_system = "Linux"; then have_faac=no if which faac >/dev/null 2>/dev/null; then have_faac=yes fi # if test $have_faac = "yes"; then정 # # we have lame and faac - see if faac is built with mp4 support # faac --help >&faac_help # sdf=`grep "MP4 support unavailable" faac_help` # rm -f faac_help # if test -z "$sdf"; then # if which mpeg4ip-config >/dev/null 2>/dev/null; then # echo "Warning - faac uses libmp4v, but we've detected a version" # echo "of mpeg4ip. If you get errors building mp4live, please" # echo "rebuild faac without mp4v2 support" # else # echo "Error - we have detected a version of faac that has libmp4v2 support" # echo "and no copy of mpeg4ip-config. This means faac was built with" # echo "faad2 and the libraries will be incompatible". # echo "Please reinstall faac without mp4v2 support" # exit 1 # fi # fi # fi fi set -x
Compile Errors 수정
error: ambiguates old declaration ‘const char* strcasestr(const char*, const char*)’
: /usr/include/string.h에 정의된 것과 mpeg4ip의 include/mpeg4ip.h에서 정의하고 있는 function signature가 서로 다르게 때문이다. 다음과 같이 mpeg4ip.h의 선언 부분을 막아준다.
#ifdef __cplusplus extern "C" { #endif //char *strcasestr(const char *haystack, const char *needle); #ifdef __cplusplus } #endif
error: invalid conversion from ‘const char*’ to ‘char*’
: 간단하게 type casting으로 (char*)를 붙여서 막는다. function signature를 고치는게 더 바람직 할것 같다고 생각했으나, 일부 header file들은 c와 c++에서 함께 불리기 때문에 const string으로 변경하면 c compiler에서 오류가 생긴다. signature는 그냥 두고, caller쪽에서 type casting을 해주는 것이 더 편한 방법이 될 것 같다.
error: dereferencing type-punned pointer will break strict-aliasing rules
: lib/rtp/Makefile의 CFLAGS에 -fno-strict-aliasing를 추가한다. 이 Makefile은 bootstrap을 실행해야 생성되는 것임에 주의.
CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -Wall -Werror -W -Wmissing-prototypes -Wmissing-declarations -Wbad-function-cast -Wwrite-strings -Wformat=2 -fno-strict-aliasing CPP = gcc -E CPPFLAGS =
fatal error: istream.h: No such file or directory
: 몇몇 컴파일러에서는 ISO compliant 파일인 iostream을 사용하도록 장려된다고 한다 (참조). entropy.hpp와 bitstrm.hpp의 해당 부분을 iostream으로 대체하고, using 구문을 추가해 준다.
common/video/iso-mpeg4/include/entropy.hpp
#ifndef __ENTROPY_HPP_ #define __ENTROPY_HPP_ #include <iostream> //#include <istream.h> //#include <ostream.h> using std::istream; using std::ostream;
common/video/iso-mpeg4/include/bitstrm.hpp
#include <iostream> #include "inbits.h" //#include <istream.h> //#include <ostream.h>
error: suggest parentheses around ‘&&’ within ‘||’
: 오류가 난 라인을 찾아가서 조건문에 괄호를 붙여 준다.
error: suggest explicit braces to avoid ambiguous ‘else’
: 표시된 라인을 찾아가서 중괄호를 붙여 준다.
error: iostream.h: No such file or directory
: iostream.h로 #include한 구문을 찾지 못하는 문제. 어느 c++ 책에서 읽은 기억이 있는데, include되는 것을 file별로 구분하는 것은 컴파일러의 구현에 따라 달라질 수 있는 사항이어서 실제로 파일별로 존재할 수도 있고 그렇지 않을 수도 있다. 따라서 .h를 명시하지 않는 것이 추천되는 방법이라고 했던 기억이 난다. 오류난 곳을 찾아 #include <iostream>으로 변경해 준다. fstream.h에 대해서도 동일하게 #include <fstream>으로 변경해 준다.
error: ‘vctCandMV2’ may be used uninitialized in this function
: Class가 초기화 되지 않고 사용되었다는 오류이다. 실제로는 생성자를 불러줘야 하지만, 사용법을 모르니 그냥 common/video/iso-mpeg4/src/Makefile의 BILLS_CPPWARNINGS와 BILL_CWARNINGS에서 -Wall option을 삭제 한다.
//BILLS_CPPWARNINGS = -Wall -Wno-char-subscripts -Woverloaded-virtual -Wno-unknown-pragmas -Wno-deprecated -Wformat=2 BILLS_CPPWARNINGS = -Wno-char-subscripts -Woverloaded-virtual -Wno-unknown-pragmas -Wno-deprecated -Wformat=2 //BILLS_CWARNINGS = -Wall -Wmissing-prototypes -Wmissing-declarations -Wno-char-subscripts -Wno-unknown-pragmas -Wformat=2 BILLS_CWARNINGS = -Wmissing-prototypes -Wmissing-declarations -Wno-char-subscripts -Wno-unknown-pragmas -Wformat=2
error: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
: -Werror가 선언되어 있으면, 이것을 오류로 보고 한다. common/video/iso-mpeg4/src/Makefile의 AM_CXXFLAGS에서 -Wall과 -Werror를 삭제한다.
//AM_CXXFLAGS = -D__TRACE_AND_STATS_ -D__DOUBLE_PRECISION_ -D_REENTRANT -DNOCONTROLS -fexceptions -Wall -Werror -D_OBSS_ -Wall -Wno-char-subscripts -Woverloaded-virtual -Wno-unknown-pragmas -Wno-deprecated -Wformat=2 AM_CXXFLAGS = -D__TRACE_AND_STATS_ -D__DOUBLE_PRECISION_ -D_REENTRANT -DNOCONTROLS -fexceptions -D_OBSS_ -Wno-char-subscripts -Woverloaded-virtual -Wno-unknown-pragmas -Wno-deprecated -Wformat=2
* 만들어진 패치와 그것을 적용하는 방법에 대해서는 “mpeg4ip-1.5.0.1을 ubuntu 12.04에서 컴파일 하기 1“을 참조.