【问题标题】:Cannot Compile C Program That Uses a Library (FFmpeg) with GCC Because of the Library's Include Statements由于库的包含语句,无法使用 GCC 编译使用库 (FFmpeg) 的 C 程序
【发布时间】:2019-01-04 02:35:57
【问题描述】:

我无法编译使用名为“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

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

如果是这样,有没有办法自动执行此操作?这个库很大,可能有数百个这样的语句。

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


注意事项:

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

如果我在这里使用的任何术语不正确或我的解释很差,我深表歉意。我对编译几乎一无所知。如果我需要填写更多信息,请告诉我。

【问题讨论】:

  • 为了快速编译,使用“-I Test/FFmpeg”。我不建议将此作为您的长期解决方案。
  • 不需要在标题中添加FFmpeg/。通常我们只是直接#include &lt;libavcodec/avcode.h&gt; 并给 gcc 一些选项来指定在哪里定位额外的第三方头文件。此外,我认为您需要另一个选项来指示 lib 路径。

标签: c++ c gcc ffmpeg compilation


【解决方案1】:

#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\User\Documents\Test\FFmpeg -c test.c

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

gcc -IFFmpeg -c test.c

这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多