使用mingw c++连接到ffmpeg库 -> 未定义引用

4
我阅读了很多类似的问题,但没有一个可以解决我的问题。我感觉只需要迈出一小步就能成功...
我有一个现有的c++项目,尝试包含一些FFmpeg函数。当在Windows操作系统上使用MinGW链接FFmpeg库时,我总是收到“undefined reference to”的错误消息。
我将我的代码完全简化为以下示例:
// START of file simple.cpp
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

#include <math.h>

#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>

int main(int argc, char **argv){
    avcodec_register_all();
    return 0;
}
// END of file simple.cpp

我使用以下编译器:

g++ -o simple.o -c simple.cpp -std=gnu++11

这个运作良好。 我的链接命令如下:

g++ -o simple.exe simple.o -lavcodec -std=gnu++11

我得到了以下错误信息:

simple.o:simple.cpp:(.text+0xc): undefined reference to avcodec_register_all()

至少找到了库文件;-) 我直接使用了来自Zeranoe的库,我也成功地从源代码编译出新的库,但两种情况下错误信息都是相同的。

寻找解决方案的一步可能是进行以下测试(使用gcc而不是g++进行编译):

  1. 我将simple.cpp重命名为simple.c

  2. 我使用以下命令进行编译:

    gcc -o simple.o -c simple.c

  3. 我使用以下链接器进行链接:

    g++ -o simple.o -c simple.c -lavcodec

这样就可以工作了!!!

但不幸的是,这对我来说不是一个解决方案,因为我的主要程序确实是c++,必须使用g++进行编译。

那么这里到底出了什么问题呢?
这是FFmpeg的问题还是gcc/g++的问题?
请提供所有的提示和建议。

我已经尝试了所有可能的“extern”和“extern“C”的语句,但没有成功。


请不要使用“到底是什么鬼”的说法。你有检查过 g++ 编译器的版本吗?我是指降级它?我觉得 g++ 有时候会出问题。 - Ankit Tanna
抱歉 - 我不会再犯了。- g++没问题,只是缺少了一个extern语句。Gerhard。 - Gerhard
1个回答

3
许多库在其头文件中具有以下定义:

#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif

这个不会这样做。以下似乎有效:
extern "C" {
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
}

nm simple.o 命令将显示符号名称的差异。


非常感谢!那解决了我的问题。请原谅,这个问题已经在其他地方得到解决。我使用了错误的关键词进行搜索。祝你度过愉快的时光!Gerhard。 - Gerhard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接