使用mingw c ++链接到ffmpeg库 - >未定义参考

时间:2016-07-15 22:56:28

标签: gcc ffmpeg linker g++ mingw

我在这里读到了很多非常相似的问题,但似乎没有一个问题 解决我的问题。我觉得我只需要很小的一步就能成功......

我有一个现有的c ++项目,并尝试包含一些FFmpeg函数。 当在Windows操作系统上与MinGW连接到FFmpeg库时,我总是得到 错误消息“未定义引用...”。

我将代码完全缩减为以下示例:

// 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

  4. 这将有效!!!

    但是,不幸的是,这对我来说没有解决方案,因为我的主要计划 肯定是c ++,必须用g ++编译。

    那么,这到底是怎么回事?
    这是一个FFmpeg主题还是gcc / g ++话题? 拜托,欢迎提供所有提示。

    我已经尝试过所有可能的'extern'和extern“C” - 声明,但没有成功。

1 个答案:

答案 0 :(得分:2)

许多库的头文件中都有以下定义

#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将显示符号名称的差异。