You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键改动说明

  1. 新增依赖库静态编译步骤:手动下载并编译libmp3lame、x264、opus的静态版本,安装到本地WORKSPACE目录,确保FFmpeg编译时链接静态库而非系统动态库。
  2. 移除系统依赖路径:删除原脚本中--extra-ldflags里的-L/usr/local/opt/lame/lib -Wl,-rpath,/usr/local/opt/lame/lib,避免依赖系统中的动态库。
  3. 补充必要静态链接库:在--extra-libs中添加-lbz2 -lz,确保静态编译时包含所有必要的系统依赖。
  4. 前置依赖提示:添加brew安装pkg-config和yasm的说明,这些是编译依赖库的必要工具。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:53:09