C++ 无法编译使用带有GCC的库(FFmpeg)的C程序,因为库';s包括声明
我无法编译使用名为“FFmpeg”的库和名为“GCC”的编译器的C项目,我相信这可能是因为我不太了解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中包
#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