【问题标题】:ffmpeg on iOS 5.1 Undefined Symbols ErroriOS 5.1 上的 ffmpeg 未定义符号错误
【发布时间】:2012-05-05 16:10:08
【问题描述】:

所以我现在已经花了几个小时来研究网上关于为 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=/Volumes/Lion/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer 导出 SDKROOT=$DEVROOT/SDKs/${PLATFORM}${MAX_VERSION}.sdk 导出 CC=$DEVROOT/usr/bin/llvm-gcc 导出 LD=$DEVROOT/usr/bin/ld 导出 CPP=$DEVROOT/usr/bin/cpp 导出 CXX=$DEVROOT/usr/bin/llvm-g++ 导出 AR=$DEVROOT/usr/bin/ar 导出 LIBTOOL=$DEVROOT/usr/bin/libtool 导出 NM=$DEVROOT/usr/bin/nm 导出 CXXCPP=$DEVROOT/usr/bin/cpp 导出 RANLIB=$DEVROOT/usr/bin/ranlib

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

FFMPEG_LIBS="libavcodec libavdevice libavformat libavutil libswscale"

echo "正在构建 armv6..​​."

清理 ./configure \ --cpu=arm1176jzf-s\ --extra-cflags='-arch armv6 -miphoneos-version-min=${MIN_VERSION} -mthumb' \ --extra-ldflags='-arch armv6 -miphoneos-version-min=${MIN_VERSION}'\ --启用交叉编译\ --拱=臂\ --目标操作系统=达尔文\ --cc=${CC}\ --sysroot=${SDKROOT} \ --prefix=已安装\ --禁用网络\ --禁用解码器\ --禁用多路复用器\ --禁用解复用器\ --禁用设备\ --禁用解析器\ --禁用编码器\ --禁用协议\ --禁用过滤器\ --禁用-bsfs \ --启用解码器=h264 \ --启用解码器=svq3 \ --启用-gpl \ --启用图片\ --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};做 cp ./$i/$i.a ./build.armv6/;完成

echo "正在构建 armv7..."

清理 ./configure \ --cpu=皮质-a8\ --extra-cflags='-arch armv7 -miphoneos-version-min=${MIN_VERSION} -mthumb' \ --extra-ldflags='-arch armv7 -miphoneos-version-min=${MIN_VERSION}'\ --启用交叉编译\ --拱=臂\ --目标操作系统=达尔文\ --cc=${CC}\ --sysroot=${SDKROOT} \ --prefix=已安装\ --禁用网络\ --禁用解码器\ --禁用多路复用器\ --禁用解复用器\ --禁用设备\ --禁用解析器\ --禁用编码器\ --禁用协议\ --禁用过滤器\ --禁用-bsfs \ --启用解码器=h264 \ --启用解码器=svq3 \ --启用-gpl \ --启用图片\ --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};做 cp ./$i/$i.a ./build.armv7/;完成

mkdir -p build.universal for i in ${FFMPEG_LIBS};做 lipo -create ./build.armv7/$i.a ./build.armv6/$i.a -输出 ./build.universal/$i.a; 完成

对于 ${FFMPEG_LIBS} 中的 i;做 cp ./build.universal/$i.a ./$i/$i.a;完成

进行安装

【问题讨论】:

    标签: iphone ios ffmpeg


    【解决方案1】:

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

    1)

    让我们看看这个符号是否真的存在于你的编译库中。

    转到终端并将“cd”转到您的 .a 库所在的目录。

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

    如果它没有出现,那么它没有被编译到你的库中。

    2)

    如果您的库中确实存在该符号,请确保您的 .a 文件的路径在您的项目中是正确的。您可能不小心只包含了 ffmpeg 的仅模拟器(i386 架构)版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2015-07-15
      • 2012-06-19
      • 2012-10-10
      相关资源
      最近更新 更多