2016-07-15 76 views
1

我在这里阅读了很多非常类似的问题,但他们都没有看到 来解决我的问题。我觉得我只需要一小步就可以成功...使用mingw链接到ffmpeg库C++ - > undefined reference

我有一个现有的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代替克++):

  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” - 语句,但没有成功。

+0

请不要使用什么类型的声明。你用g ++编译器版本检查过吗?我的意思是降级它?我觉得有时候g ++很脆弱。 –

+0

对不起 - 我不会再这样做。 - 克++是好的,这是一个失踪的外部陈述。格哈德。 – Gerhard

回答

1

许多图书馆有以下定义在他们的头文件

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

+0

非常感谢!这解决了我的问题。请原谅,这个问题已经在别的地方解决了。我用错误的关键词搜索。玩的很开心!格哈德。 – Gerhard