我无法使用名为“ 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
。.dll
和.so
。如果在此使用的任何术语错误或解释不当,我深表歉意。我对编译几乎一无所知。请让我知道是否需要填写更多信息。
答案 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
这解决了我的问题。