我在这里读到了很多非常相似的问题,但似乎没有一个问题 解决我的问题。我觉得我只需要很小的一步就能成功......
我有一个现有的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 ++编译):
我将simple.cpp重命名为simple.c
我编译:
gcc -o simple.o -c simple.c
我链接:
g++ -o simple.o -c simple.c -lavcodec
这将有效!!!
但是,不幸的是,这对我来说没有解决方案,因为我的主要计划 肯定是c ++,必须用g ++编译。
那么,这到底是怎么回事?
这是一个FFmpeg主题还是gcc / g ++话题?
拜托,欢迎提供所有提示。
我已经尝试过所有可能的'extern'和extern“C” - 声明,但没有成功。
答案 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
将显示符号名称的差异。