【问题标题】:Undefined references linking to libav* with mingw使用 mingw 链接到 libav* 的未定义引用
【发布时间】:2013-10-26 01:40:14
【问题描述】:

概述

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

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

详情

我已经下载了Zeranoe64-bit dev package,解压到C:\apps\pf\ffmpeg。现在我只是想在doc/examples 中构建decoding_encoding.c 文件。我的 CWD 是 C:\apps\pf\ffmpeg\doc\examples,我的命令看起来像这样(添加了行继续和 cmets):

#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

【问题讨论】:

  • @Haroogan:很好,谢谢!安装 MinGW-w64 是一场噩梦,但一旦我安装了它,我终于可以针对 libav* 进行构建了。如果您将其发布为答案,我很乐意接受。

标签: linker ffmpeg mingw libav


【解决方案1】:

我已经在README 中看到这个库是用 MinGW-w64 构建的,并且面向 64 位。普通的旧 MinGW 不支持 64 位目标。因此,如果您使用的是 MinGW,那么它当然无法链接到 64 位库,因此您会遇到这些错误。

要解决您的问题,只需安装 MinGW-w64。我强烈建议从 here 下载它的发行版。没有安装噩梦:只需解压,将bin 添加到PATH 环境变量中即可。

最后,看看这个post,可能对你了解谁是谁很有用。

【讨论】:

  • 呃,当您访问mingw-w64.sourceforge.net 时,安装的噩梦就来了,但您是对的,mingw-builds 安装程序很轻松。不相关但对我来说是个大问题,mingw-w64 没有真正的 libscrnsave 实现,所以它不能代替我的 mingw。
  • 它包含libscrnsave.a。仔细看。
  • 它在那里,但仔细看更多 =) 它只有 1KB,实际上并没有实现任何东西。显然,如果您查看 src 代码,它都被 #if 0 注释掉了。也许改天我会取消注释并尝试从 src 构建 mingw-w64。
  • 好的,我明白你的意思了。嗯,这很奇怪,也许你可以在邮件列表上问他们,那里的人通常会很有帮助。
  • 感谢您的提示。看起来它已经长大了,就在六月。希望很快会有修复:sourceforge.net/p/mingw-w64/discussion/723798/thread/54ec11c2
【解决方案2】:

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

构建libav 相当简单,一旦我想通了。它是这样的:

  1. http://www.mingw.org/ 下载并安装mingw 安装程序。
  2. 使用 mingw 安装程序安装 MSYS。
  3. http://yasm.tortall.net/Download.html下载yasm
  4. 将下载的 yasm 可执行文件重命名为 yasm.exe,并将其放在 bin 下的 MSYS 目录中。
  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 命令行构建它们。

要与pkg-config 一起使用,您需要将安装位置下的lib/pkgconfig 目录添加到PKG_CONFIG_PATH 环境变量中。要正确构建,您应该使用pkg-config <LIBS> --cflags --libs 获取正确的标志以传递给gcc,其中<LIBS> 是您需要构建的libav 库的列表。只包含所有的 libav 库并没有什么害处,但顺序很重要。以下顺序似乎对我有用:libavdevice libavformat libavcodec libavfilter libswscale libavresample libavutil

最终,我使用的命令行看起来像这样(行继续并添加了 cmets):

#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-03-15
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2020-06-27
    • 2016-10-06
    • 2014-02-04
    相关资源
    最近更新 更多