Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法编译使用带有GCC的库(FFmpeg)的C程序,因为库';s包括声明_C++_C_Gcc_Ffmpeg_Compilation - Fatal编程技术网

C++ 无法编译使用带有GCC的库(FFmpeg)的C程序,因为库';s包括声明

C++ 无法编译使用带有GCC的库(FFmpeg)的C程序,因为库';s包括声明,c++,c,gcc,ffmpeg,compilation,C++,C,Gcc,Ffmpeg,Compilation,我无法编译使用名为“FFmpeg”的库和名为“GCC”的编译器的C项目,我相信这可能是因为我不太了解#include是如何工作的,或者是因为我使用了错误的编译过程 在名为Test的文件夹中,我有一个文件Test/Test.c,其中包含以下内容: #include <stdio.h> #include <stdlib.h> #include "FFmpeg/libavcodec/avcodec.h" 文件Test/FFmpeg/libavcodec/avcodec.h中包

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

在名为
Test
的文件夹中,我有一个文件
Test/Test.c
,其中包含以下内容:

#include <stdio.h>
#include <stdlib.h>
#include "FFmpeg/libavcodec/avcodec.h"
文件
Test/FFmpeg/libavcodec/avcodec.h
中包含以下代码:

#include "libavutil/samplefmt.h"
#include "libavutil/attributes.h"
#include "libavutil/avutil.h"
... //many more #include statements
这里的问题是我需要在所有这些include语句中添加“
FFmpeg/
”吗

如果是的话,有没有办法自动做到这一点?这个库非常庞大,可能有数百条这样的语句

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


笔记:
  • 我用来编译的命令是
    gcc-ctest.c
  • 我已经通过MinGW安装了GCC
  • 我最终需要能够将这个程序编译成
    .dll
    .so

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

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

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

在我的例子中,我将
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
作为路径可能相对的位置。因此,我可以使用compile命令:

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

这就解决了我的问题。

要快速编译,请使用“-I Test/FFmpeg”。我不建议将此作为您的长期解决方案。无需在标题中添加
FFmpeg/
。通常我们只需直接包含,并为gcc提供一些选项来指定在何处定位其他第三方头。此外,我认为您需要另一个选项来指示lib路径。
gcc -IFFmpeg -c test.c