Huawei Atlas 200環境におけるFFmpegリンクエラーの根本的対処法

昇騰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

タグ: Huawei_Atlas_200 CANN_7.0 FFmpeg_4.4 Linker_Error arm64

6月14日 21:36 投稿