⚠️ 这是一个非官方翻译网站,与 FFmpeg 项目无关。准确信息请参阅原文(https://ffmpeg.org/faq.html)

FFmpeg 常见问题(FAQ)

1 常规问题

1.1 为什么 FFmpeg 不支持 [xyz] 功能?

因为还没有人着手做这项工作。FFmpeg 的开发由对各个开发者而言重要的任务驱动。如果某个功能对你很重要,实现它的最佳方式就是自己承担这项工作,或者赞助一位开发者。

1.2 FFmpeg 不支持 codec XXX,能否加入 Windows DLL 加载器来提供支持?

不能。Windows 的 DLL 不具备可移植性、体积臃肿,而且往往运行缓慢。此外,FFmpeg 力求以原生方式支持所有 codec,DLL 加载器无助于实现这一目标。

1.3 这个格式看起来 ffmpeg 是支持的,但我无法读取该文件。

即使 ffmpeg 能读取该 container 格式,也不代表它支持其中的所有 codec。请查阅 ffmpeg 文档中受支持的 codec 列表。

1.4 Windows 支持哪些 codec?

除非安装一些额外的 codec,否则 Windows 无法很好地支持 MPEG 等标准格式。

下面这些视频 codec 应该能在大多数 Windows 系统上运行:

msmpeg4v2

.avi/.asf

msmpeg4

仅 .asf

wmv1

仅 .asf

wmv2

仅 .asf

mpeg4

仅当安装了 ffdshow 或 Xvid 等 MPEG-4 codec 时才可以。

mpeg1video

仅 .mpg

请注意,Windows 中的 ASF 文件通常带有 .wmv 或 .wma 扩展名。还应提到的是,Microsoft 声称拥有 ASF 格式的专利,可能会对使用非 Microsoft 软件制作 ASF 文件的用户提起诉讼或发出警告。强烈建议尽量避免使用 ASF。

下面这些音频 codec 应该能在大多数 Windows 系统上运行:

adpcm_ima_wav adpcm_ms pcm_s16le

始终可用

libmp3lame

如果安装了 LAME 等 MP3 codec。

2 编译

2.1 error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

这是 gcc 中的一个缺陷,请不要向我们报告,请转而报告给 gcc 的开发者。另外,我们不会为 gcc 的缺陷添加变通方案。

另请注意,(部分)gcc 开发者认为这并不是缺陷,或者不是他们应该修复的缺陷:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=11203。不过话说回来,他们当中有些人甚至分不清不可判定问题与 NP 困难问题的区别……

2.2 我已经用发行版的包管理器安装了这个库,为什么 configure 却检测不到它?

发行版通常会把库拆分成多个软件包。主软件包中包含运行使用该库的程序所需的文件,开发软件包中包含构建使用该库的程序所需的文件。有时文档和(或)数据也会被放在单独的软件包中。

要构建 FFmpeg,你需要安装开发软件包,其名称通常为 libfoo-dev 或 libfoo-devel。构建完成后可以将其卸载,但一定要保留主软件包。

2.3 如何让 pkg-config 找到我的库?

你的库中会附带一个(或多个)位于 pkgconfig 目录下的 .pc 文件。你需要设置环境变量,让 pkg-config 指向这些文件。

如果你需要向 pkg-config 的搜索列表中 添加 目录(典型场景:单独安装的库),请将其加入 $PKG_CONFIG_PATH

export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig

如果你需要 替换 pkg-config 的搜索列表(典型场景:交叉编译),请设置 $PKG_CONFIG_LIBDIR

export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig

如果你需要知道库的内部依赖关系(典型场景:静态链接),请为 pkg-config 添加 --static 选项:

./configure --pkg-config-flags=--static

2.4 交叉编译时如何使用 pkg-config

最好的办法是在交叉编译环境中安装 pkg-config,这样它就会自动使用交叉编译用的库。

你也可以使用宿主环境中的 pkg-config,方法是向 configure 显式指定 --pkg-config=pkg-config。在这种情况下,你必须像上一条目所说的那样,使用 PKG_CONFIG_LIBDIRpkg-config 指向正确的目录。

作为一种折中方案,你可以在交叉编译环境中放置一个脚本,用设置好的 PKG_CONFIG_LIBDIR 调用宿主的 pkg-config,该脚本大致如下:

#!/bin/sh
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
export PKG_CONFIG_LIBDIR
exec /usr/bin/pkg-config "$@"

3 用法

3.1 ffmpeg 无法运行,问题出在哪里?

请先在 ffmpeg 的源代码目录中执行 make distclean 再构建。如果这样仍无法解决问题,请参阅(https://ffmpeg.org/bugreports.html)。

3.2 如何把连续编号的静态图片编码为视频?

首先,把图片重命名为连续编号,例如 img1.jpg、img2.jpg、img3.jpg……然后执行:

ffmpeg -f image2 -i img%d.jpg /tmp/a.mpg

请注意,‘%d’ 会被替换为图片编号。

img%03d.jpg 表示 img001.jpg、img002.jpg 等一系列编号。

使用 -start_number 选项可以声明序列的起始编号。如果你的序列不是从 img001.jpg 开始,但仍按数字顺序排列,这个选项会很有用。下面的示例从 img100.jpg 开始:

ffmpeg -f image2 -start_number 100 -i img%d.jpg /tmp/a.mpg

如果要重命名的图片数量很多,可以使用下面的命令减轻负担。这条命令使用 bourne shell 语法,把当前目录下所有匹配 *jpg 的文件,依次以 img001.jpg、img002.jpg 等名称符号链接到 /tmp 目录。

x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

如果想按修改时间从旧到新排序,把 *jpg 替换为 $(ls -r -t *jpg)

然后执行:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg

对于 ffmpeg 能读取的任何图片格式,都适用同样的原理。

你也可以使用 cat 把图片通过管道传给 ffmpeg:

cat *.jpg | ffmpeg -f image2pipe -c:v mjpeg -i - output.mpg

3.3 如何把视频编码为一系列静态图片?

使用:

ffmpeg -i movie.mpg movie%d.jpg

作为输入使用的 movie.mpg 会被转换为 movie1.jpg、movie2.jpg 等一系列文件……

除了依赖文件格式的自动识别,你也可以使用

-c:v ppm -c:v png -c:v mjpeg

来强制指定编码格式。

把这一点应用到前面的示例:

ffmpeg -i movie.mpg -f image2 -c:v mjpeg menu%d.jpg

请注意,并不存在 "jpeg" 这个 codec,请改用 "mjpeg"。

3.4 为什么多线程 MPEG* 编码会出现轻微的画质下降?

对于多线程 MPEG* 编码,编码后的各个条带必须相互独立,否则线程 n 实际上就得等待线程 n-1 完成,因此出现轻微的画质下降是很合理的。这并不是缺陷。

3.5 如何从标准输入读取,或写入标准输出?

使用 - 作为文件名。

3.6 -f jpeg 不起作用。

请尝试 ’-f image2 test%d.jpg’。

3.7 为什么无法更改帧率?

有些 codec(例如 MPEG-1/2)只允许少数几种固定的帧率。请使用 -c:v 命令行选项换用其他 codec。

3.8 如何用 ffmpeg 编码 Xvid 或 DivX 视频?

Xvid 和 DivX(版本 4 以上)都是 ISO MPEG-4 标准的实现(请注意,使用同一标准的编码格式还有很多)。因此,使用 ’-c:v mpeg4’ 即可以这些格式进行编码。MPEG-4 编码文件中默认保存的 fourcc 是 ’FMP4’。如果想使用不同的 fourcc,请使用 ’-vtag’ 选项。例如,’-vtag xvid’ 会强制把 ’xvid’ 这个 fourcc 保存为视频的 fourcc,而不是默认值。

3.9 编码高画质 MPEG-4 时,有哪些较好的参数?

’-mbd rd -flags +mv4+aic -trellis 2 -cmp 2 -subcmp 2 -g 300 -pass 1/2’。值得一试的还有:’-bf 2’、’-mpv_flags qp_rd’、’-mpv_flags mv0’、’-mpv_flags skip_rd’。

3.10 编码高画质 MPEG-1/MPEG-2 时,有哪些较好的参数?

’-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’,不过要注意 ’-g 100’ 可能会给某些 decoder 带来问题。值得一试的还有:’-bf 2’、’-mpv_flags qp_rd’、’-mpv_flags mv0’、’-mpv_flags skip_rd’。

3.11 用 ffmpeg 编码后,隔行视频看起来很糟糕,问题出在哪里?

对于隔行素材,应该使用 ’-flags +ilme+ildct’,必要时再加上 ’-flags +alt’;如果结果看起来非常混乱,可以试试 ’-top 0/1’。

3.12 如何读取 DirectShow 文件?

如果你在构建 FFmpeg 时加上了 ./configure --enable-avisynth(仅在 MinGW/Cygwin 平台上可行),那么 DirectShow 能读取的任何文件都可以用作输入。

只需创建一个只有下面这一行内容的文本文件 "input.avs"……

DirectShowSource("C:\path to your file\yourfile.asf")

……然后把这个文本文件传给 ffmpeg:

ffmpeg -i input.avs

关于 AviSynth 的其他任何帮助,请访问 AviSynth 主页

3.13 如何合并视频文件?

“合并”视频文件是相当模糊的说法。下面的列表说明了各种不同的“合并”方式,并指出 FFmpeg 分别是如何处理的。合并视频文件可能是指:

  • 把它们逐个接续放在一起:这称为把它们 拼接(concatenate,简称 concat),本 FAQ 正是讨论这个操作。
  • 把它们放进同一个文件,让用户可以在不同版本之间选择(例如:不同的音频语言):这称为把它们 封装 在一起(multiplex,简称 mux),只需用多个 -i 选项调用 ffmpeg 即可完成。
  • 对音频而言,把所有声道合并到单个流中(例如:把两路单声道流合并成一路立体声流):这有时称为 合并(merge)它们,可以使用 amerge 滤镜完成。
  • 对音频而言,让一路叠加播放在另一路之上:这称为 混音(mix)它们,做法是先把它们合并成单个流,再使用 pan 滤镜按需混合各声道。
  • 对视频而言,把两者一起显示,可以并排显示,也可以让一个叠加在另一个的局部之上;这可以使用 overlay 视频滤镜完成。

3.14 如何拼接视频文件?

根据具体情况的不同,有几种解决方法。

3.14.1 使用 concat 滤镜 拼接

FFmpeg 有专门为此设计的 concat 滤镜,文档中附有示例。如果你需要重新编码,推荐使用这种方法。

3.14.2 使用 concat demuxer 拼接

FFmpeg 有一个 concat demuxer,当你想避免重新编码、而所用格式又不支持文件级拼接时,可以使用它。

3.14.3 使用 concat 协议 拼接(文件级别)

FFmpeg 有专门为此设计的 concat 协议,文档中附有示例。

少数几种多媒体 container(MPEG-1、MPEG-2 PS、DV)允许仅通过拼接包含视频的文件本身来拼接视频。

因此,你可以先把多媒体文件转码为这些特殊格式,再使用朴素的 cat 命令(在 Windows 下则用同样朴素的 copy)拼接,最后再转码回你想要的格式。

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

此外,你也可以使用 concat 协议来代替 catcopy,从而避免创建可能非常庞大的中间文件。

ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi

请注意,字符 "|" 在许多 shell 中有特殊含义,你可能需要对它进行转义。

如果你的平台支持,另一种方法是使用命名管道:

mkfifo intermediate1.mpg
mkfifo intermediate2.mpg
ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
cat intermediate1.mpg intermediate2.mpg |\
ffmpeg -f mpeg -i - -c:v mpeg4 -c:a libmp3lame output.avi

3.14.4 使用原始音频和视频拼接

同样,yuv4mpegpipe 格式以及原始视频、原始音频 codec 也支持拼接,而且转码步骤几乎是无损的。当使用多个 yuv4mpegpipe 时,除第一路流外,其余各流都需要丢弃首行,具体做法如下面所示,通过管道传给 tail 即可实现。请注意,通过 tail 传递管道时,必须使用命令分组 { ;} 才能正确地放到后台运行。

举例来说,假设我们要把两个 FLV 文件拼接成一个 output.flv 文件:

mkfifo temp1.a
mkfifo temp1.v
mkfifo temp2.a
mkfifo temp2.v
mkfifo all.a
mkfifo all.v
ffmpeg -i input1.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp1.a < /dev/null &
ffmpeg -i input2.flv -vn -f u16le -c:a pcm_s16le -ac 2 -ar 44100 - > temp2.a < /dev/null &
ffmpeg -i input1.flv -an -f yuv4mpegpipe - > temp1.v < /dev/null &
{ ffmpeg -i input2.flv -an -f yuv4mpegpipe - < /dev/null | tail -n +2 > temp2.v ; } &
cat temp1.a temp2.a > all.a &
cat temp1.v temp2.v > all.v &
ffmpeg -f u16le -c:a pcm_s16le -ac 2 -ar 44100 -i all.a \
       -f yuv4mpegpipe -i all.v \
       -y output.flv
rm temp[12].[av] all.[av]

3.15 使用 -f lavfi 时,音频莫名其妙变成了单声道。

使用 -dumpgraph - 可以准确找出声道布局是在哪里丢失的。

很可能是通过 auto-inserted aresample 丢失的。请弄清楚为什么在那个位置需要这个转换滤镜。

输出之前的位置很可能就是原因所在,因为 -f lavfi 目前只支持 packed S16。

然后在 filtergraph 中显式插入正确的 aformat,指定确切的格式。

aformat=sample_fmts=s16:channel_layouts=stereo

3.16 为什么 FFmpeg 没有识别出我的 VOB 文件中的字幕?

VOB 以及少数其他格式没有描述文件中全部内容的全局头。取而代之的是,应用程序需要扫描文件来了解其中的内容。由于 VOB 文件通常很大,往往只扫描开头部分。如果字幕出现在文件较后的位置,一开始就不会被检测到。

包括 ffmpeg 命令行工具在内的一些应用程序,只能处理在初次扫描中检测到的流,之后才检测到的流会被忽略。

初次扫描的规模由两个选项控制:probesize(默认约 5 MB)和 analyzeduration(默认 5,000,000 µs = 5 s)。要让字幕流被检测到,这两个值都必须足够大。

3.17 为什么 ffmpeg 的 -sameq 选项被移除了?应该用什么代替?

-sameq 选项的意思是 "same quantizer"(相同的量化器),只在非常有限的一些情况下才有意义。遗憾的是,很多人把它误解为 "same quality"(相同的画质),并在不合适的场合使用了它:它确实大致能达到预期的可见效果,但实现方式非常低效。

每种 encoder 都有自己的一套选项,用来设置画质与体积之间的平衡,请使用你所用 encoder 的选项,把画质设置到你满意的水平。最常用的选项是 -qscale 和 -qmax,不过你应该仔细阅读所选 encoder 的文档。

3.18 我的视频画面被拉伸了,为什么缩放不能修复它?

许多视频 codec 和格式都可以保存视频的 宽高比:这是指整幅画面的宽高之比(DAR,display aspect ratio),或者单个像素的宽高之比(SAR,sample aspect ratio)。举例来说,分辨率为 640×350 的 EGA 屏幕的 DAR 为 4:3,SAR 为 35:48。

大多数静态图像处理都以正方形像素为前提,即 SAR 为 1:1,但许多视频标准——尤其是模拟向数字过渡时代的标准——使用的是非正方形像素。

FFmpeg 中大多数处理滤镜都会考虑宽高比,以避免画面被拉伸:裁剪会调整 DAR 以保持 SAR 不变,缩放则会调整 SAR 以保持 DAR 不变。

如果你想拉伸画面,或者“取消拉伸”,就需要使用 setdar or setsar filters 覆盖这些信息。

别忘了仔细检查原始视频,确认画面拉伸究竟是来自图像本身,还是来自宽高比信息。

举例来说,要修复一个编码不佳的 EGA 采集画面,可以使用下面的命令:第一条把像素放大为正方形,第二条设置正确的宽高比,第三条则避免转码(是否有效取决于格式、codec、播放器,乃至运气):

ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut

3.19 如何把 ffmpeg 作为后台任务运行?

ffmpeg 在执行操作期间,通常会检查控制台输入,以响应诸如 "q" 停止、"?" 显示帮助之类的输入。ffmpeg 没有办法判断自己是否正作为后台任务运行。当它检查控制台输入时,可能会导致在后台运行 ffmpeg 的进程被挂起。

要阻止这些输入检查、让 ffmpeg 能够作为后台任务运行,请在调用 ffmpeg 时使用 -nostdin 选项。无论你是在 shell 中运行 ffmpeg,还是通过操作系统 API 把 ffmpeg 作为独立进程调用,这个方法都有效。

另一种办法是,当你在 shell 中运行 ffmpeg 时,可以把标准输入重定向到 /dev/null(Linux 和 macOS 上)或 NUL(Windows 上)。这个重定向既可以直接加在 ffmpeg 的调用上,也可以放在调用 ffmpeg 的 shell 脚本里。

例如:

ffmpeg -nostdin -i INPUT OUTPUT

或者(在 Linux、macOS 及其他类 UNIX shell 上):

ffmpeg -i INPUT OUTPUT </dev/null

或者(在 Windows 上):

ffmpeg -i INPUT OUTPUT <NUL

3.20 如何防止 ffmpeg 出现 suspended (tty output) 之类的消息而被挂起?

如果你在后台运行 ffmpeg,可能会发现它的进程被挂起了,还可能出现类似 suspended (tty output) 的消息。问题是如何防止进程被挂起。

例如:

% ffmpeg -i INPUT OUTPUT &> ~/tmp/log.txt &
[1] 93352
%
[1]  + suspended (tty output)  ffmpeg -i INPUT OUTPUT &>

尽管消息里写的是 "tty output",但这里真正的问题在于,ffmpeg 运行时通常会检查控制台输入。操作系统检测到这一点后,就会挂起该进程,直到你把它切回前台并进行处理为止。

解决办法是使用正确的技巧告诉 ffmpeg 不要查询控制台输入。你可以使用 -nostdin 选项,或者用 < /dev/null 重定向标准输入。详情请参阅 FAQ 中的 如何把 ffmpeg 作为后台任务运行?

4 开发

4.1 有没有示例说明如何使用 FFmpeg 的库,尤其是 libavcodec 和 libavformat?

有。请查看源代码仓库中的 doc/examples 目录,也可以在线查看:https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples

示例默认也会被安装,通常位于 $PREFIX/share/ffmpeg/examples

你也可以阅读 FFmpeg 文档中的 Developers Guide。或者,也可以查看已经集成了 FFmpeg 的众多开源项目之一(projects.html)的源代码。

4.2 能支持我的 C 编译器 XXX 吗?

视情况而定。如果你的编译器符合 C99 标准,只要用于支持它的补丁不会用与该编译器相关的 #ifdef 污染源代码,就很可能受到欢迎。

4.3 支持 Microsoft Visual C++ 吗?

支持。请参阅 FFmpeg 文档中的 Microsoft Visual C++ 一节。

4.4 能加入对 automake、libtool 或 autoconf 的支持吗?

不能。这些工具过于臃肿,会使构建变得复杂。

4.5 为什么不用面向对象的 C++ 重写 FFmpeg?

FFmpeg 已经采用高度模块化的方式组织,不需要用正式的面向对象语言重写。而且,许多开发者更偏好纯 C,这对他们来说效果很好。关于这个话题的更多论述,请阅读 "Programming Religion"

4.6 为什么 ffmpeg 的程序里没有调试符号?

构建过程会生成包含完整调试信息的 ffmpeg_gffplay_g 等文件,再对这些二进制文件执行 strip 操作,生成 ffmpegffplay 等。如果需要调试信息,请使用 *_g 版本。

4.7 我不喜欢 LGPL,能不能改用 GPL 贡献代码?

可以,只要这段代码是可选的,并且能够干净利落地放到 #if CONFIG_GPL 之下而不破坏任何东西。举例来说,一个新的 codec 或滤镜可以用 GPL,但对 LGPL 代码的缺陷修复就不行。

4.8 我在自己的 C 应用程序中使用 FFmpeg,但链接器提示库本身缺少符号。

FFmpeg 默认构建静态库。在静态库中,依赖关系不会被自动处理。这带来两个后果:第一,你必须按依赖顺序指定各个库,例如 -lavdevice 必须放在 -lavformat 之前,-lavutil 必须放在其他所有库之后;第二,FFmpeg 中用到的外部库也必须一并指定。

要按依赖顺序得到所需库的完整列表,一个简单的办法是使用 pkg-config

c99 -o program program.c $(pkg-config --cflags --libs libavformat libavcodec)

更多细节请参阅 doc/example/Makefile 和 doc/example/pc-uninstalled。

4.9 我在自己的 C++ 应用程序中使用 FFmpeg,但链接器提示一些看似存在的符号缺失。

FFmpeg 是一个纯 C 项目,因此要在 C++ 应用程序中使用这些库,你需要明确声明自己使用的是 C 库。做法是用 extern "C" 把 FFmpeg 的 include 包起来。

请参阅 http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3

4.10 我在自己的 C++ 应用程序中使用 libavutil,但编译器提示 ’UINT64_C’ 在此作用域中未声明

FFmpeg 是一个使用 C99 数学特性的纯 C 项目,要让 C++ 也能使用这些特性,你需要在 CXXFLAGS 中追加 -D__STDC_CONSTANT_MACROS

4.11 我有一个位于内存中的文件,或者一套不同于 open/read/ libc 的 API,该如何在 libavformat 中使用它?

你需要使用 avio_alloc_context 创建一个自定义的 AVIOContext,请参阅 FFmpeg 中的 libavformat/aviobuf.c,以及 MPlayer 或 MPlayer2 源代码中的 libmpdemux/demux_lavf.c。

4.12 关于 ffv1、msmpeg4、asv1、4xm 的文档在哪里?

请参阅 https://www.ffmpeg.org/~michael/

4.13 如何把 H.263-RTP(以及其他装载在 RTP 中的 codec)提供给 libavcodec?

RTP 虽然因面向网络而显得特殊,但它和其他 container 一样,也是一种 container。在把 payload 提供给 libavcodec 之前,你必须先对 RTP 进行 解封装。关于这种具体情况该如何处理,请查阅 RFC 4629。

4.14 AVStream.r_frame_rate 的值不对,它比帧率大得多。

r_frame_rate 并不是平均帧率,而是能够准确表示所有时间戳的最小帧率。所以,它比平均值大并不算错!例如,如果内容混合了 25 fps 和 30 fps,那么 r_frame_rate 会是 150(即最小公倍数)。如果你要找的是平均帧率,请参阅 AVStream.avg_frame_rate

4.15 为什么 make fate 没有运行全部测试?

请确认你已经准备好 fate-suite 样本,并且 SAMPLES 这个 Make 变量、FATE_SAMPLES 环境变量,或者 configure--samples 选项已经设置为正确的路径。

4.16 为什么 make fate 找不到样本?

你的样本路径中是不是碰巧有一个表示主目录的 ~ 字符?程序使用该值的方式无法让 shell 展开它,导致 FATE 找不到文件。请把 ~ 替换成完整路径。

主机托管由 telepoint.bg 提供