昇騰310B4チップを搭載したHuawei Atlas 200I DK A2開発ボード(CANN 7.0.RC1環境)で発生するFFmpeg関連のリンクエラーを解消する方法について解説します。
リンクエラーの発生状況
FFmpeg 4.2.9をインストール後にコンパイル実行すると、以下の未定義シンボルエラーが発生します。
/usr/bin/ld: libavformat.so.58: undefined reference to `avpriv_packet_list_free@LIBAVCODEC_58'
/usr/bin/ld: libavformat.so.58: undefined reference to `avpriv_packet_list_get@LIBAVCODEC_58'
/usr/bin/ld: libavformat.so.58: undefined reference to `avpriv_packet_list_put@LIBAVCODEC_58'
collect2: error: ld returned 1 exit status
原因分析
このエラーはFFmpeg 4.3以前のバージョンで非公開APIが削除されたことが原因です。公式ドキュメントを確認すると:
- FFmpeg 4.2/4.3:
avpriv_packet_list_*シリーズ関数が存在しない - FFmpeg 4.4以降:
libavcodec/packet_history.hに実装が追加
エラーメッセージのLIBAVCODEC_58は、FFmpeg 4.4で導入されたAPIバージョンを示しています。
解決手順
FFmpeg 4.4系のインストール
以下の手順で最新互換バージョンを構築します。
wget https://ffmpeg.org/releases/ffmpeg-v4.4.4-src.tar.gz
tar xzvf ffmpeg-v4.4.4-src.tar.gz
cd ffmpeg_build
./configure \
--prefix=/opt/ffmpeg \
--enable-shared \
--disable-static \
--enable-libavdevice \
--enable-demuxer=mov \
--enable-protocol=file \
--disable-doc
make -j$(nproc)
sudo make install
ライブラリパスの設定
システムが新規ライブラリを認識するため、以下の設定を追加します。
echo "/opt/ffmpeg/lib" | sudo tee /etc/ld.so.conf.d/ffmpeg.conf
sudo ldconfig
export FFMPEG_LIB_PATH=/opt/ffmpeg/lib
旧バージョンの完全削除
既存のFFmpeg環境を確実に削除するには:
sudo apt purge ffmpeg* -y
sudo find /usr -name "*libav*" -exec rm -f {} \;
sudo rm -rf /usr/local/include/libav* /usr/local/lib/libav*
削除確認コマンド:
ffmpeg --version # "command not found"が正常な状態
検証結果
インストール後、API互換性を確認:
ffmpeg --version
# 出力例:
# ffmpeg version 4.4.4
# libavformat 58.76.100 # 58系バージョンでエラー解消
必要なシンボルが存在することをnmコマンドで確認:
nm -D /opt/ffmpeg/lib/libavcodec.so | grep avpriv_packet_list_
# 出力例:
# 00000000001a2b3c T avpriv_packet_list_free