1

概述

我正在尝试ffmpeg使用 mingw 从 Windows 上的 src 目录构建一个示例文件,但是我得到了大量对一堆libav*函数的未定义引用。

我已经看过这个问题和其他几个问题,但没有一个能解决我的问题。具体来说,我不是在构建 C++ 程序,也不是在使用g++,所以整个extern "C"事情都不适用(实际上我已经尝试过了,但它没有用)。

细节

我已经下载了 Zeranoe64 位开发包,并将其解压缩为C:\apps\pf\ffmpeg. 现在我只是想decoding_encoding.cdoc/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。我强烈建议从这里下载它的发行版。没有安装噩梦:只需解压缩,添加binPATH环境变量中就可以了。

最后,看看这篇文章,它可能对你了解谁是谁很有用。

于 2013-10-18T01:34:54.623 回答
1

只是为了结束这个循环,我对 mingw-w64 不满意,特别是因为它缺乏有用的libscrnsave. 因此,我libav使用标准从源代码构建mingw

libav一旦我弄清楚了,建筑就相当简单了。它是这样的:

  1. 从http://www.mingw.org/下载并安装 mingw 安装程序。
  2. 使用 mingw 安装程序安装 MSYS。
  3. 从http://yasm.tortall.net/Download.html下载 yasm
  4. 将下载的 yasm 可执行文件重命名为 just yasm.exe,并将其放在 MSYS 目录下的bin.
  5. 从https://libav.org/download.html下载 libav 源
  6. 解压 libav 源。
  7. 打开 MSYS 和cdlibav 源所在的任何位置。
  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 命令行构建它们。

要使用 with pkg-config,您需要将lib/pkgconfig安装位置下的目录添加到PKG_CONFIG_PATHenv 变量中。要正确构建,您应该使用pkg-config <LIBS> --cflags --libs获取正确的标志以传递给gcc<LIBS>您需要构建的 libav 库列表在哪里。只包含所有的 libav 库并没有什么害处,但顺序很重要。以下顺序似乎对我有用: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 回答