2012-04-25 2 views
0

J'ai donc passé plusieurs heures à travailler sur la faible quantité d'informations disponibles en ligne sur la construction de ffmpeg pour iOS. Le processus de construction semble bien fonctionner et je me retrouve avec de gros fichiers pour armv6 et armv7 que je glisse dans mon projet.ffmpeg sur iOS 5.1 Symboles non définis Erreur

Cependant, chaque fois que j'essaie d'utiliser la commande « avcodec_init() » Je reçois l'erreur suivante:

Undefined symbols for architecture armv7: "_avcodec_init", referenced from:

-[FirstViewController viewDidLoad] in FirstViewController.o 

ld: symbol(s) not found for architecture armv7

clang: error: linker command failed with exit code 1 (use -v to see invocation)

Les fichiers de bibliothèque sont inclus dans le « lien binaire avec les bibliothèques » des paramètres du projet, afin ils sont définitivement compilés dans l'application. Je ne peux tout simplement pas m'expliquer pourquoi je reçois une erreur à ce sujet.

J'ai essayé plusieurs projets différents et j'ai téléchargé des fichiers de projet existants sur le Web et j'ai ressenti la même erreur.

C'est le script de compilation je:

export PLATFORM="iPhoneOS" export MIN_VERSION="4.0" export MAX_VERSION="5.1" export DEVROOT=/Volumes/Lion/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer export SDKROOT=$DEVROOT/SDKs/${PLATFORM}${MAX_VERSION}.sdk export CC=$DEVROOT/usr/bin/llvm-gcc export LD=$DEVROOT/usr/bin/ld export CPP=$DEVROOT/usr/bin/cpp export CXX=$DEVROOT/usr/bin/llvm-g++ export AR=$DEVROOT/usr/bin/ar export LIBTOOL=$DEVROOT/usr/bin/libtool export NM=$DEVROOT/usr/bin/nm export CXXCPP=$DEVROOT/usr/bin/cpp export RANLIB=$DEVROOT/usr/bin/ranlib

COMMONFLAGS="-pipe -gdwarf-2 -no-cpp-precomp -isysroot ${SDKROOT} -marm -fPIC" export LDFLAGS="${COMMONFLAGS} -fPIC" export CFLAGS="${COMMONFLAGS} -fvisibility=hidden" export CXXFLAGS="${COMMONFLAGS} -fvisibility=hidden -fvisibility-inlines-hidden"

FFMPEG_LIBS="libavcodec libavdevice libavformat libavutil libswscale"

echo "Building armv6..."

make clean ./configure \ --cpu=arm1176jzf-s \ --extra-cflags='-arch armv6 -miphoneos-version-min=${MIN_VERSION} -mthumb' \ --extra-ldflags='-arch armv6 -miphoneos-version-min=${MIN_VERSION}' \ --enable-cross-compile \ --arch=arm \ --target-os=darwin \ --cc=${CC} \ --sysroot=${SDKROOT} \ --prefix=installed \ --disable-network \ --disable-decoders \ --disable-muxers \ --disable-demuxers \ --disable-devices \ --disable-parsers \ --disable-encoders \ --disable-protocols \ --disable-filters \ --disable-bsfs \ --enable-decoder=h264 \ --enable-decoder=svq3 \ --enable-gpl \ --enable-pic \ --disable-doc perl -pi -e 's/HAVE_INLINE_ASM 1/HAVE_INLINE_ASM 0/' config.h make -j3

mkdir -p build.armv6 for i in ${FFMPEG_LIBS}; do cp ./$i/$i.a ./build.armv6/; done

echo "Building armv7..."

make clean ./configure \ --cpu=cortex-a8 \ --extra-cflags='-arch armv7 -miphoneos-version-min=${MIN_VERSION} -mthumb' \ --extra-ldflags='-arch armv7 -miphoneos-version-min=${MIN_VERSION}' \ --enable-cross-compile \ --arch=arm \ --target-os=darwin \ --cc=${CC} \ --sysroot=${SDKROOT} \ --prefix=installed \ --disable-network \ --disable-decoders \ --disable-muxers \ --disable-demuxers \ --disable-devices \ --disable-parsers \ --disable-encoders \ --disable-protocols \ --disable-filters \ --disable-bsfs \ --enable-decoder=h264 \ --enable-decoder=svq3 \ --enable-gpl \ --enable-pic \ --disable-doc perl -pi -e 's/HAVE_INLINE_ASM 1/HAVE_INLINE_ASM 0/' config.h make -j3

mkdir -p build.armv7 for i in ${FFMPEG_LIBS}; do cp ./$i/$i.a ./build.armv7/; done

mkdir -p build.universal for i in ${FFMPEG_LIBS}; do lipo -create ./build.armv7/$i.a ./build.armv6/$i.a -output ./build.universal/$i.a; done

for i in ${FFMPEG_LIBS}; do cp ./build.universal/$i.a ./$i/$i.a; done

make install

Répondre

0

Je ne l'ai pas utilisé ffmpeg encore (même si un certain nombre de mes patrons me ont eu à penser à l'utiliser), mais laissez-moi suggérer une ou deux choses qui pourrait se passer ici.

1)

Voyons voir si le symbole existe vraiment dans votre bibliothèque compilée.

Accédez au terminal et "cd" au répertoire où réside votre bibliothèque.

Puis tapez "nm -arch armv7 ffmpeg.a | egrep avcodec_init" (où vous pouvez remplacer ffmpeg.a dans mon exemple de commande avec le nom réel de la bibliothèque .a) tous sur une ligne. Cela vide les symboles dans la bibliothèque pour l'architecture armv7 et l'envoie dans grep, ce qui devrait vous montrer si avcodec_init existe réellement dans votre bibliothèque.

S'il n'apparaît pas, il n'a pas été compilé dans votre bibliothèque.

2)

Si le symbole existe dans votre bibliothèque, puis assurez-vous que le chemin vers votre fichier .a est correct dans votre projet. Il se peut que vous ne fassiez qu'inclure une version de ffmpeg (architecture i386) sur simulateur uniquement.

Questions connexes