Mac 10.13编译的FFmpeg在其他Mac运行失败:libmp3lame.0.dylib缺失
解决Mac下编译FFmpeg无法在其他设备运行的问题
问题背景
在Mac OS High Sierra 10.13上通过sh buildffmpeg.sh编译FFmpeg,生成的ffmpeg-mac文件夹转移到Big Sur 11.2.3的MacBook上执行时,报错:
dyld: Library not loaded: /usr/local/opt/lame/lib/libmp3lame.0.dylib
Referenced from: /Users/martinbarker/Documents/projects/rendertunev1.1.2/./ffmpeg-mac/ffmpeg
Reason: image not found
Abort trap: 6
原编译脚本如下:
#!/bin/bash # If you get error `c compiler failed` run `sudo apt install libglfw3-dev libglew-dev` # apt-get install build-essential # apt-get build-dep ffmpeg # when running this on mac, you need to install some libraries such as 'brew install opus' set -e CWD=$(pwd) PACKAGES="$CWD/packages" WORKSPACE="$CWD/workspace" ADDITIONAL_CONFIGURE_OPTIONS="" mkdir -p "$PACKAGES" mkdir -p "$WORKSPACE" FFMPEG_TAG="$1" FFMPEG_URL="http://git.ffmpeg.org/gitweb/ffmpeg.git/snapshot/74c4c539538e36d8df02de2484b045010d292f2c.tar.gz" FFMPEG_ARCHIVE="$PACKAGES/ffmpeg.tar.gz" if [ ! -f "$FFMPEG_ARCHIVE" ]; then echo "Downloading tag ${FFMPEG_TAG}..." curl -L -o "$FFMPEG_ARCHIVE" "$FFMPEG_URL" fi EXTRACTED_DIR="$PACKAGES/extracted" mkdir -p "$EXTRACTED_DIR" echo "Extracting..." tar -xf "$FFMPEG_ARCHIVE" --strip-components=1 -C "$EXTRACTED_DIR" cd "$EXTRACTED_DIR" echo "Building..." # Min electron supported version MACOS_MIN="10.10" ./configure $ADDITIONAL_CONFIGURE_OPTIONS \ --pkgconfigdir="$WORKSPACE/lib/pkgconfig" \ --prefix=${WORKSPACE} \ --pkg-config-flags="--static" \ --extra-cflags="-I$WORKSPACE/include -mmacosx-version-min=${MACOS_MIN}" \ --extra-ldflags="-L$WORKSPACE/lib -mmacosx-version-min=${MACOS_MIN} -L/usr/local/opt/lame/lib -Wl,-rpath,/usr/local/opt/lame/lib" \ --extra-libs="-lpthread -lm" \ --enable-static \ --disable-securetransport \ --disable-debug \ --disable-shared \ --disable-ffplay \ --disable-lzma \ --disable-doc \ --enable-version3 \ --enable-pthreads \ --enable-runtime-cpudetect \ --enable-avfilter \ --enable-filters \ --disable-libxcb \ --enable-gpl \ --disable-libass \ --enable-libmp3lame \ --enable-libx264 \ --enable-libopus make -j 4 make install otool -L "$WORKSPACE/bin/ffmpeg" otool -L "$WORKSPACE/bin/ffprobe" echo "Building done. The binaries can be found here: $WORKSPACE/bin/ffmpeg $WORKSPACE/bin/ffprobe" mkdir ffmpeg-mac/ cp -r "$WORKSPACE/bin/" "$CWD/ffmpeg-mac/" rm -rf "$PACKAGES" rm -rf "$WORKSPACE" exit 0
原因分析
当前脚本编译时依赖系统中已安装的动态版libmp3lame,并且通过-rpath指定了本地路径,导致生成的FFmpeg二进制文件在其他设备上找不到该依赖库。要实现可移植,需要静态编译所有依赖库,而不是依赖系统中的动态库。
修改后的编译脚本
#!/bin/bash # 前置依赖:先通过brew安装编译所需工具 # brew install pkg-config yasm set -e CWD=$(pwd) PACKAGES="$CWD/packages" WORKSPACE="$CWD/workspace" ADDITIONAL_CONFIGURE_OPTIONS="" # 创建临时目录 mkdir -p "$PACKAGES" mkdir -p "$WORKSPACE" # 编译静态版libmp3lame LAME_VERSION="3.100" LAME_URL="https://downloads.sourceforge.net/project/lame/lame/${LAME_VERSION}/lame-${LAME_VERSION}.tar.gz" LAME_ARCHIVE="$PACKAGES/lame-${LAME_VERSION}.tar.gz" if [ ! -f "$LAME_ARCHIVE" ]; then echo "Downloading libmp3lame ${LAME_VERSION}..." curl -L -o "$LAME_ARCHIVE" "$LAME_URL" fi LAME_EXTRACTED="$PACKAGES/lame-${LAME_VERSION}" if [ ! -d "$LAME_EXTRACTED" ]; then echo "Extracting libmp3lame..." tar -xf "$LAME_ARCHIVE" -C "$PACKAGES" fi cd "$LAME_EXTRACTED" echo "Building libmp3lame..." ./configure \ --prefix="$WORKSPACE" \ --disable-shared \ --enable-static \ --disable-debug make -j 4 make install # 编译静态版x264 X264_VERSION="snapshot-20240521-2245" X264_URL="https://download.videolan.org/pub/x264/snapshots/x264-${X264_VERSION}.tar.bz2" X264_ARCHIVE="$PACKAGES/x264-${X264_VERSION}.tar.bz2" if [ ! -f "$X264_ARCHIVE" ]; then echo "Downloading x264 ${X264_VERSION}..." curl -L -o "$X264_ARCHIVE" "$X264_URL" fi X264_EXTRACTED="$PACKAGES/x264-${X264_VERSION}" if [ ! -d "$X264_EXTRACTED" ]; then echo "Extracting x264..." tar -xf "$X264_ARCHIVE" -C "$PACKAGES" fi cd "$X264_EXTRACTED" echo "Building x264..." ./configure \ --prefix="$WORKSPACE" \ --disable-shared \ --enable-static \ --disable-opencl make -j 4 make install # 编译静态版opus OPUS_VERSION="1.4" OPUS_URL="https://archive.mozilla.org/pub/opus/opus-${OPUS_VERSION}.tar.gz" OPUS_ARCHIVE="$PACKAGES/opus-${OPUS_VERSION}.tar.gz" if [ ! -f "$OPUS_ARCHIVE" ]; then echo "Downloading opus ${OPUS_VERSION}..." curl -L -o "$OPUS_ARCHIVE" "$OPUS_URL" fi OPUS_EXTRACTED="$PACKAGES/opus-${OPUS_VERSION}" if [ ! -d "$OPUS_EXTRACTED" ]; then echo "Extracting opus..." tar -xf "$OPUS_ARCHIVE" -C "$PACKAGES" fi cd "$OPUS_EXTRACTED" echo "Building opus..." ./configure \ --prefix="$WORKSPACE" \ --disable-shared \ --enable-static make -j 4 make install # 编译FFmpeg FFMPEG_TAG="$1" FFMPEG_URL="http://git.ffmpeg.org/gitweb/ffmpeg.git/snapshot/74c4c539538e36d8df02de2484b045010d292f2c.tar.gz" FFMPEG_ARCHIVE="$PACKAGES/ffmpeg.tar.gz" if [ ! -f "$FFMPEG_ARCHIVE" ]; then echo "Downloading FFmpeg..." curl -L -o "$FFMPEG_ARCHIVE" "$FFMPEG_URL" fi EXTRACTED_DIR="$PACKAGES/ffmpeg-extracted" mkdir -p "$EXTRACTED_DIR" echo "Extracting FFmpeg..." tar -xf "$FFMPEG_ARCHIVE" --strip-components=1 -C "$EXTRACTED_DIR" cd "$EXTRACTED_DIR" echo "Building FFmpeg..." # Min electron supported version MACOS_MIN="10.10" ./configure $ADDITIONAL_CONFIGURE_OPTIONS \ --pkgconfigdir="$WORKSPACE/lib/pkgconfig" \ --prefix=${WORKSPACE} \ --pkg-config-flags="--static" \ --extra-cflags="-I$WORKSPACE/include -mmacosx-version-min=${MACOS_MIN}" \ --extra-ldflags="-L$WORKSPACE/lib -mmacosx-version-min=${MACOS_MIN}" \ --extra-libs="-lpthread -lm -lbz2 -lz" \ --enable-static \ --disable-securetransport \ --disable-debug \ --disable-shared \ --disable-ffplay \ --disable-lzma \ --disable-doc \ --enable-version3 \ --enable-pthreads \ --enable-runtime-cpudetect \ --enable-avfilter \ --enable-filters \ --disable-libxcb \ --enable-gpl \ --disable-libass \ --enable-libmp3lame \ --enable-libx264 \ --enable-libopus make -j 4 make install echo "Checking binary dependencies..." otool -L "$WORKSPACE/bin/ffmpeg" otool -L "$WORKSPACE/bin/ffprobe" echo "Building done. The binaries can be found here: $WORKSPACE/bin/ffmpeg $WORKSPACE/bin/ffprobe" mkdir -p ffmpeg-mac/ cp -r "$WORKSPACE/bin/" "$CWD/ffmpeg-mac/" # 清理临时文件 rm -rf "$PACKAGES" rm -rf "$WORKSPACE" exit 0
关键改动说明
- 新增依赖库静态编译步骤:手动下载并编译
libmp3lame、x264、opus的静态版本,安装到本地WORKSPACE目录,确保FFmpeg编译时链接静态库而非系统动态库。 - 移除系统依赖路径:删除原脚本中
--extra-ldflags里的-L/usr/local/opt/lame/lib -Wl,-rpath,/usr/local/opt/lame/lib,避免依赖系统中的动态库。 - 补充必要静态链接库:在
--extra-libs中添加-lbz2 -lz,确保静态编译时包含所有必要的系统依赖。 - 前置依赖提示:添加brew安装
pkg-config和yasm的说明,这些是编译依赖库的必要工具。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

