由于库的包含语句,无法编译使用带有库(FFmpeg)和GCC的C程序

时间:2018-07-27 02:37:23

标签: c++ c gcc ffmpeg compilation

我无法使用名为“ FFmpeg”的库和名为“ GCC”的编译器来编译C项目,我相信这可能是因为我不太了解#include的工作原理,或者是因为我使用了错误的编译过程。

在名为Test的文件夹中,我有一个文件Test/test.c,内容如下:

#include <stdio.h>
#include <stdlib.h>
#include "FFmpeg/libavcodec/avcodec.h"

文件夹FFmpeg位于Test/FFmpeg。当我尝试使用GCC进行编译时,出现以下错误:

fatal error: libavutil/samplefmt.h: No such file or directory

文件Test/FFmpeg/libavcodec/avcodec.h中包含以下代码:

#include "libavutil/samplefmt.h"
#include "libavutil/attributes.h"
#include "libavutil/avutil.h"
... //many more #include statements

这是我需要在所有这些include语句中添加“ FFmpeg/”的问题吗?

如果是,是否有一种自动执行此操作的方法?该库非常庞大,可能包含数百条这样的语句。

如果没有,我应该怎么做?我应该尝试自行编译该库吗?如果是这样,我该如何在程序中包含该库的编译版本?


注意:

  • 我用来编译的命令是gcc -c test.c
  • 我通过MinGW安装了GCC。
  • 我最终需要能够将此程序编译为.dll.so

如果在此使用的任何术语错误或解释不当,我深表歉意。我对编译几乎一无所知。请让我知道是否需要填写更多信息。

1 个答案:

答案 0 :(得分:0)

#include与引号一起使用时(例如#include "file path here"),它将读取该文件路径作为相对文件路径

在使用GCC编译C程序的情况下,文件路径是相对于当前目录的。 “当前目录”是您使用cd command放置命令提示符的目录。

在我的情况下,我cd进入了C:/Users/User/Documents/Test,这意味着所有相对文件路径都相对于C:/Users/User/Documents/Test。所以当我的编译器读取

#include "libavutil/samplefmt.h"

它基本上试图做到这一点:

#include C:/Users/User/Documents/Test/libavutil/samplefmt.h

当我需要编译器查看…/Test/FFmpeg/libavutil/samplefmt.h时。

事实证明,解决方案是为编译器提供相对路径可能相对的其他位置。编译时使用-I[file path here]参数完成。

就我而言,我需要使用此想法的方法是将C:/Users/User/Documents/Test/FFmpeg添加为路径可能相对的位置。因此,我本来可以执行我的编译命令:

gcc -c test.c

并插入此:

gcc -IC:\Users\rawpo\Documents\Test\FFmpeg -c test.c

但是,这实际上是一个非常笨拙的解决方案。有一种更简单的方法:事实证明,您使用-I参数提供的这些文件路径可以相对于当前目录本身。就我而言,由于命令提示符中的当前目录已经C:/Users/User/Documents/Test,因此我可以简单地从上面的命令中删除此部分,将其缩短为:

gcc -IFFmpeg -c test.c

这解决了我的问题。