正常使用C编译器
#include <stdio.h>
// 包含ffmpeg头文件
#include "libavutil/avutil.h"
int main()
{
printf("Hello FFMPEG, version is %s\n", av_version_info());
return 0;
}
如果使用C++编译器
需要在C++代码中兼容C语言的库
#include <iostream>
#ifdef __cplusplus ///
extern "C"
{
// 包含ffmpeg头文件
#include "libavutil/avutil.h"
}
#endif
using namespace std;
int main()
{
printf("Hello FFMPEG, version is %s\n", av_version_info());
return 0;
}
__cplusplus
__cplusplus
是一个预定义的宏(由编译器自动定义的特殊宏,它们在程序中始终可用,不需要程序员显式定义),只有在用C++编译器编译代码时才会定义;如果代码在C编译器中编译,这个宏是未定义的。
这里是使用条件编译指令确保只有在C++环境下才执行相应代码块。
extern “C”
extern "C"
是C++中的一个关键字,用于指示函数或全局变量使用C语言的函数名修饰规则(也叫作链接规范)。
C和C++的函数名修饰规则不同。C++支持函数重载,所以C++编译器会对函数名进行“修饰”(即“name mangling”),使得编译后的函数名包含函数的参数信息;而C语言不支持函数重载,编译器不会修饰函数名,函数名保持原样。例如,C语言中的一个函数 void foo(int) 编译后的符号名仍然是 foo,但在C++中,它可能会被编译为类似于 foo_int 这样的形式。
使用 extern “C” 的原因:FFmpeg是用C语言编写的,因此其头文件定义的函数使用C语言的链接规范。如果你在C++代码中直接包含FFmpeg头文件,而不使用 extern “C”,C++编译器会对FFmpeg的函数名进行修饰,导致在链接阶段找不到正确的符号。所以在C++中包含C语言库时,通常需要使用 extern “C” 来避免函数名修饰,确保C++编译器正确解析C语言的符号。