1

概要

ffmpegmingw を使用して、Windowsの src ディレクトリからサンプル ファイルの 1 つをビルドしようとしていますが、一連のlibav*関数への未定義の参照が大量に発生します。

私はすでにこの質問と他のいくつかを見てきましたが、どれも私の問題を解決しませんでした. 具体的には、私はC++ プログラムを作成しておら、 も使用していないg++ため、すべてextern "C"が当てはまりません (実際、既に試しましたが、動作しませんでした)。

詳細

Zeranoe64 ビット dev パッケージをダウンロードし、展開しましたC:\apps\pf\ffmpeg。今、私はdecoding_encoding.cファイルをビルドしようとしていますdoc/examples. 私の CWD はC:\apps\pf\ffmpeg\doc\examplesで、コマンドは次のようになります (行の継続とコメントが追加されています)。

#Compile
gcc -o decoding_encoding.obj -c -IC:\apps\pf\ffmpeg\include decoding_encoding.c

#Link
gcc -o decoding_encoding.exe decoding_encoding.obj \
    -LC:\apps\pf\ffmpeg\lib -lavformat -lavcodec -lavdevice \
    -lavfilter -lavutil -lswscale -lm

コンパイルは正常に動作しますが、リンクは次のエラーを吐き出します:

decoding_encoding.obj:decoding_encoding.c:(.text+0xca): undefined reference to `av_get_channel_layout_nb_channels'
decoding_encoding.obj:decoding_encoding.c:(.text+0x131): undefined reference to `avcodec_find_encoder'
decoding_encoding.obj:decoding_encoding.c:(.text+0x179): undefined reference to `avcodec_alloc_context3'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1fa): undefined reference to `av_get_sample_fmt_name'
decoding_encoding.obj:decoding_encoding.c:(.text+0x26c): undefined reference to `av_get_channel_layout_nb_channels'
decoding_encoding.obj:decoding_encoding.c:(.text+0x28f): undefined reference to `avcodec_open2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x313): undefined reference to `avcodec_alloc_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x3c8): undefined reference to `av_samples_get_buffer_size'
decoding_encoding.obj:decoding_encoding.c:(.text+0x3d6): undefined reference to `av_malloc'
decoding_encoding.obj:decoding_encoding.c:(.text+0x44f): undefined reference to `avcodec_fill_audio_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x4ce): undefined reference to `av_init_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x5c2): undefined reference to `avcodec_encode_audio2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x63a): undefined reference to `av_free_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x680): undefined reference to `avcodec_encode_audio2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x6f8): undefined reference to `av_free_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x722): undefined reference to `av_freep'
decoding_encoding.obj:decoding_encoding.c:(.text+0x72d): undefined reference to `avcodec_free_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x738): undefined reference to `avcodec_close'
decoding_encoding.obj:decoding_encoding.c:(.text+0x743): undefined reference to `av_free'
decoding_encoding.obj:decoding_encoding.c:(.text+0x77b): undefined reference to `av_init_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x7a1): undefined reference to `avcodec_find_decoder'
decoding_encoding.obj:decoding_encoding.c:(.text+0x7e9): undefined reference to `avcodec_alloc_context3'
decoding_encoding.obj:decoding_encoding.c:(.text+0x840): undefined reference to `avcodec_open2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x8e6): undefined reference to `av_free'
decoding_encoding.obj:decoding_encoding.c:(.text+0x947): undefined reference to `avcodec_alloc_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x999): undefined reference to `avcodec_get_frame_defaults'
decoding_encoding.obj:decoding_encoding.c:(.text+0x9c2): undefined reference to `avcodec_decode_audio4'
decoding_encoding.obj:decoding_encoding.c:(.text+0xa44): undefined reference to `av_samples_get_buffer_size'
decoding_encoding.obj:decoding_encoding.c:(.text+0xb7d): undefined reference to `avcodec_close'
decoding_encoding.obj:decoding_encoding.c:(.text+0xb88): undefined reference to `av_free'
decoding_encoding.obj:decoding_encoding.c:(.text+0xb96): undefined reference to `avcodec_free_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0xbe4): undefined reference to `avcodec_find_encoder'
decoding_encoding.obj:decoding_encoding.c:(.text+0xc2c): undefined reference to `avcodec_alloc_context3'
decoding_encoding.obj:decoding_encoding.c:(.text+0xcee): undefined reference to `av_opt_set'
decoding_encoding.obj:decoding_encoding.c:(.text+0xd08): undefined reference to `avcodec_open2'
decoding_encoding.obj:decoding_encoding.c:(.text+0xd8c): undefined reference to `avcodec_alloc_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0xe2f): undefined reference to `av_image_alloc'
decoding_encoding.obj:decoding_encoding.c:(.text+0xe83): undefined reference to `av_init_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0xfd3): undefined reference to `avcodec_encode_video2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x105f): undefined reference to `av_free_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x10a9): undefined reference to `avcodec_encode_video2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1135): undefined reference to `av_free_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x117e): undefined reference to `avcodec_close'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1189): undefined reference to `av_free'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1194): undefined reference to `av_freep'
decoding_encoding.obj:decoding_encoding.c:(.text+0x119f): undefined reference to `avcodec_free_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1272): undefined reference to `avcodec_decode_video2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x13b1): undefined reference to `av_init_packet'
decoding_encoding.obj:decoding_encoding.c:(.text+0x13fa): undefined reference to `avcodec_find_decoder'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1442): undefined reference to `avcodec_alloc_context3'
decoding_encoding.obj:decoding_encoding.c:(.text+0x14ba): undefined reference to `avcodec_open2'
decoding_encoding.obj:decoding_encoding.c:(.text+0x153e): undefined reference to `avcodec_alloc_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x1674): undefined reference to `avcodec_close'
decoding_encoding.obj:decoding_encoding.c:(.text+0x167f): undefined reference to `av_free'
decoding_encoding.obj:decoding_encoding.c:(.text+0x168a): undefined reference to `avcodec_free_frame'
decoding_encoding.obj:decoding_encoding.c:(.text+0x16ab): undefined reference to `avcodec_register_all'
collect2.exe: error: ld returned 1 exit status
4

2 に答える 2

3

READMEこのライブラリが MinGW-w64 でビルドされ、64 ビットをターゲットにしていることは既に確認できます。従来の MinGW は 64 ビット ターゲットをサポートしていません。したがって、MinGW を使用している場合は、もちろん 64 ビット ライブラリにリンクできないため、これらのエラーが発生します。

問題を解決するには、MinGW-w64 をインストールするだけです。ここからディストリビューションをダウンロードすることを強くお勧めします。インストールの悪夢はありません。解凍binしてPATH環境変数に追加するだけで準備完了です。

最後に、この投稿を見てください。誰が誰であるかを理解するのに役立つかもしれません。

于 2013-10-18T01:34:54.623 に答える
1

このループを閉じるために、特に mingw-w64 には便利な実装が欠けているため、私の目的には満足できませんでしたlibscrnsave。代わりにlibav、 standard を使用してソースからビルドしmingwました。

ビルドlibavは、すべてを理解したら、かなり簡単でした。こんなふうになります:

  1. http://www.mingw.org/から mingw インストーラーをダウンロードしてインストールします。
  2. mingw インストーラーを使用して MSYS をインストールします。
  3. http://yasm.tortall.net/Download.htmlから yasm をダウンロードします。
  4. ダウンロードした yasm 実行可能ファイルの名前yasm.exebin.
  5. https://libav.org/download.htmlから libav ソースをダウンロードします。
  6. libav ソースを解凍します。
  7. MSYS を開きcd、libav ソースがある場所に移動します。
  8. MSYSで、実行します./configure --disable-pthreads --disable-w32threads --prefix=/c/apps/pf/libav(これらは私にとってはうまくいったオプションです。--prefixオプションは、実行時にライブラリをインストールする場所を指定します。私のものは、make installそれらを の下に置きますC:\apps\pf\libav)。
  9. それが完了したら、make、次にを実行しmake installます。

ライブラリがビルドされると、標準の mingw を使用して通常の Windows コマンド ラインからライブラリをリンクすることができました。

で使用するには、インストール先のディレクトリをenv 変数pkg-configに追加する必要があります。適切にビルドするには、 を使用して に渡す正しいフラグを取得する必要があります。ここで、はビルドする必要がある libav ライブラリのリストです。すべての libav ライブラリをインクルードするだけで害はありませんが、順序が重要です。次の順序がうまくいくようです: .lib/pkgconfigPKG_CONFIG_PATHpkg-config <LIBS> --cflags --libsgcc<LIBS>libavdevice libavformat libavcodec libavfilter libswscale libavresample libavutil

最終的に、私が使用したコマンド ラインは次のようになりました (行の継続とコメントの追加)。

#Compile
gcc -o decoding_encoding.obj -c -IC:\apps\pf\libav\include decoding_encoding.c

#Link
gcc -o decoding_encoding.exe decoding_encoding.obj -LC:\apps\pf\libav\lib \
    -lavdevice -lavfilter -lavformat -lavcodec -lswscale -lavresample \
    -lavicap32 -lws2_32 -lpsapi -ladvapi32 -lshell32 -lavutil -lm
于 2013-10-18T13:39:56.850 に答える