iOS 5.1上的ffmpeg未定义的符号错误

时间:2012-04-25 00:22:21

标签: iphone ios ffmpeg

所以我现在花了几个小时来处理有关为iOS构建ffmpeg的大量在线信息。构建过程似乎运行良好,我最终得到armv6和armv7的胖文件,我拖到我的项目中。

但是,每当我尝试使用“avcodec_init()”命令时,我都会收到以下错误:

  

架构armv7的未定义符号:    “_avcodec_init”,引自:

 -[FirstViewController viewDidLoad] in FirstViewController.o
     

ld:找不到架构armv7的符号

     

clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

库文件包含在项目设置的“Link Binary with Libraries”中,因此它们肯定会编译到应用程序中。我不能为我的生活找出原因,为什么我在这方面遇到错误。

我尝试了几个不同的项目,并从网上下载了一些现有的项目文件并得到了同样的错误。

这是我使用的构建脚本:

  

导出PLATFORM =“iPhoneOS”导出MIN_VERSION =“4.0”导出   MAX_VERSION =“5.1”导出   DEVROOT = /卷/诺安/应用/ Xcode.app /内容/开发/平台/ $ {PLATFORM} .platform /开发人员   导出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 /斌/ 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-内联隐藏“

     

FFMPEG_LIBS =“libavcodec libavdevice libavformat libavutil libswscale”

     

echo“建立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}'\        - 启用交叉编译       --arch = arm \       --target-os = darwin \       --cc = $ {CC} \       --sysroot = $ {SDKROOT} \       --prefix =安装\       --disable-network \        - 禁用解码器       --disable-muxers \       --disable-demuxers \        - 禁用设备       --disable-parsers \        - 禁用编码器        - 禁用协议       --disable-filters \       --disable-bsfs \       --enable-decoder = h264 \       --enable-decoder = svq3 \       --enable-gpl \        - 启用图片       --disable-doc perl -pi -e's / HAVE_INLINE_ASM 1 / HAVE_INLINE_ASM 0 /'config.h make -j3

     

mkdir -p build.armv6 for $ in $ {FFMPEG_LIBS};做cp ./$i/$i.a   ./build.armv6/;完成

     

echo“建立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}'\        - 启用交叉编译       --arch = arm \       --target-os = darwin \       --cc = $ {CC} \       --sysroot = $ {SDKROOT} \       --prefix =安装\       --disable-network \        - 禁用解码器       --disable-muxers \       --disable-demuxers \        - 禁用设备       --disable-parsers \        - 禁用编码器        - 禁用协议       --disable-filters \       --disable-bsfs \       --enable-decoder = h264 \       --enable-decoder = svq3 \       --enable-gpl \        - 启用图片       --disable-doc perl -pi -e's / HAVE_INLINE_ASM 1 / HAVE_INLINE_ASM 0 /'config.h make -j3

     

mkdir -p build.armv7 for $ in $ {FFMPEG_LIBS};做cp ./$i/$i.a   ./build.armv7/;完成

     

mkdir -p build.universal for i in $ {FFMPEG_LIBS};做脂肪 - 创造   ./build.armv7/$i.a ./build.armv6/$i.a -output ./build.universal/$i.a;   完成

     

for $ in $ {FFMPEG_LIBS};做cp ./build.universal/$i.a ./$i/$i.a;完成

     

make install

1 个答案:

答案 0 :(得分:0)

我还没有使用过ffmpeg(尽管我的一些老板让我考虑过使用它),但是lemme提出了一些可能发生在这里的事情。

1)

让我们看一下你的编译库中是否存在符号。

转到终端,然后将“cd”转到.a库所在的目录。

然后在一行中键入“nm -arch armv7 ffmpeg.a | egrep avcodec_init”(您可以在我的示例命令中将ffmpeg.a替换为.a库的实际名称)。这会将库中的符号转储到armv7体系结构中并将其管道化为grep,这应该会向您显示avcodec_init是否真的 存在于您的库中。

如果没有出现,那么它就不会被编译到您的库中。

2)

如果库中存在符号,请确保项目中.a文件的路径正确。您可能偶然只包括ffmpeg的仅模拟器(i386架构)版本。