在 Windows 上构建 MLT 框架时出错

Error building MLT framework on Windows

我一直在遵循提供的官方构建指南 here。我需要 MLT 来创建视频播放器,并且我选择只安装前 4 个库,如指南中所述(FFmpeg、SDL、dlfcn-win32 和 libXML)。我还使用 QT 作为我的应用程序的主要框架。

就本指南而言,我有点困惑,因为我发现有关库应该去哪里的说明有点令人困惑。这是我当前的文件夹结构:

$HOME = C:\MinGW\msys.0\home\TKB (TKB is my user)
$HOME/build/lib -> libraries
$HOME/build/bin -> binaries
$HOME/build/include -> includes
$HOME/build/share/ffmpeg -> for the "presets" folder

同时,因为一头雾水,我在[=25=里面有相同的文件夹(binlibincludeshare) ].

然后我有 $HOME/src/mlt 和 mlt 文件。

当我 运行 configure 命令时,我得到了这个(我禁用了我没有安装的库以减少控制台上的输出):

Command: ./configure --prefix=$HOME/build --target-os=MinGW --enable-gpl --disable-decklink --disable-frei0r --disable-gtk2 --disable-sox --disable-jackrack --disable-swfdec --disable-resample

Configuring framework:
Configuring modules:
Configuring modules/avformat:
- libavformat not found: disabling
Configuring modules/core:
Configuring modules/feeds:
Configuring modules/kdenlive:
Configuring modules/linsys:
- does not build on OS X or Windows:disabling
Configuring modules/lumas:
Configuring modules/motion_est:
Configuring modules/normalize:
Configuring modules/oldfilm:
Configuring modules/opengl:
- movit not found: disabling
Configuring modules/plus:
Configuring modules/plusgpl:
Configuring modules/qt:
- Libexif not found, disabling exif features (auto rotate)
- Qt not found: disabling
Configuring modules/rtaudio:
Configuring modules/sdl:
Configuring modules/vid.stab:
- vid.stab not found: disabling
Configuring modules/videostab:
Configuring modules/vmfx:
Configuring modules/xine:
Configuring modules/xml:
- xml2 not found: disabling xml module
Configuring mlt++:
Configuring swig:
GPLv2 license used; GPLv3 components disabled

我的文件夹中有 ffmpeg 和 xml2 库,但脚本似乎无法找到它们。我也在默认文件夹中安装了 QT,但它似乎也找不到它。

无论如何我都尝试安装(全部安装),但出现以下错误:

c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -ldl
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lpthread
collect2.exe: error: ld returned 1 exit status
make[1]: *** [libmlt-6.dll] Error 1
make[1]: Leaving directory '/home/TKB/src/mlt-0.9.6/src/framework'
make: *** [all] Error 1

谁能帮我解决这些错误?

感谢您的宝贵时间。

编辑: 我发现我在创建 pkgconfig 文件夹时犯了一个命名错误,更改它解决了未检测到 xml2 的问题。另外,我手动添加了 ffmpeg 和 qt 的路径,这似乎也解决了问题。所以现在我得到的配置如下:

./configure --prefix=/home/TKB/build --enable-gpl --disable-decklink --disable-frei0r --disable-gtk2 --disable-sox --disable-jackrack --disable-swfdec --disable-resample --qt-libdir=C:/Qt/5.3/mingw482_32/lib --qt-includedir=C:/Qt/5.3/mingw482_32/include --avformat-shared=/home/TKB/share/ffmpeg --avformat-static=/home/TKB/bin

Configuring framework:
Configuring modules:
Configuring modules/avformat:
Configuring modules/core:
Configuring modules/feeds:
Configuring modules/kdenlive:
Configuring modules/linsys:
- does not build on OS X or Windows:disabling
Configuring modules/lumas:
Configuring modules/motion_est:
Configuring modules/normalize:
Configuring modules/oldfilm:
Configuring modules/opengl:
- movit not found: disabling
Configuring modules/plus:
Configuring modules/plusgpl:
Configuring modules/qt:
- Libexif not found, disabling exif features (auto rotate)
- Qt version 5.x detected
- Include directory: C:/Qt/5.3/mingw482_32/include
Configuring modules/rtaudio:
Configuring modules/sdl:
Configuring modules/vid.stab:
- vid.stab not found: disabling
Configuring modules/videostab:
Configuring modules/vmfx:
Configuring modules/xine:
Configuring modules/xml:
Configuring mlt++:
Configuring swig:
GPLv2 license used; GPLv3 components disabled

当我运行 make all install 时仍然出现错误,如下所示:

c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -ldl
collect2.exe: error: ld returned 1 exit status
make[1]: *** [libmlt-6.dll] Error 1
make[1]: Leaving directory '/home/TKB/src/mlt/src/framework'
make: *** [all] Error 1

EDIT2:我已将 dlfcn-win32binlibinclude 添加到相应的 binlibinclude 文件夹在 c:/Qt/Tools/mingw482_32 中,这解决了我的问题。现在我收到一个新错误,这似乎是类似的解决方案,但我看不到 -lbz2 是什么。 错误如下:

c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lbz2
collect2.exe: error: ld returned 1 exit status
make[2]: *** [../libmltavformat.dll] Error 1
make[2]: Leaving directory '/home/TKB/src/mlt/src/modules/avformat'
make[1]: *** [all] Error 1
make[1]: Leaving directory '/home/TKB/src/mlt/src/modules'
make: *** [all] Error 1

EDIT3:现在我收到以下错误: 在编译代码 运行s(它生成 .o)之后,我在 avformat 模块的每个文件中得到 "undefined reference to 'ffmpeg_function'"。我注意到它正确定位了包含,所以问题一定出在找到库上。

我注意到 config.mak 文件中的 LDFLAGS 是这样的:

LDFLAGS+=-L/home/TKB/bin/libavformat -L/home/TKB/bin/libavcodec -L/home/TKB/bin/libavutil
LDFLAGS+=-L/home/TKB/bin/libswscale
LDFLAGS+=-L/home/TKB/bin/libavdevice

不应该是-l(小写)来标识文件而不是文件夹吗?还是每个库需要一个文件夹?除了 ffmpeg 库的命名方式不同(例如 avformat-56.dll)

EDIT4:为了进行测试,我在 avformat 模块的 config.mak 中添加了以下内容:

LDFLAGS+=-l/home/TKB/bin/avformat-56 -l/home/TKB/bin/avcodec-56 -l/home/TKB/bin/avutil-54
LDFLAGS+=-l/home/TKB/bin/swscale-3
LDFLAGS+=-l/home/TKB/bin/avdevice-56

之前的错误消失了,但现在我得到以下错误:

c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lC:/MinGW/mysys/1.0/home/TKB/bin/avformat-56
c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lC:/MinGW/mysys/1.0/home/TKB/bin/avcodec-56
c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lC:/MinGW/mysys/1.0/home/TKB/bin/avutil-54
c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lC:/MinGW/mysys/1.0/home/TKB/bin/swscale-3
c:/Qt/Tools/mingw482_32/bin/../lib/gcc/i68-w64-mingw32/4.8.2/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lC:/MinGW/mysys/1.0/home/TKB/bin/avdevice-56
collect2.exe: error: ld returned 1 exit status
make[2]: *** [../libmltavformat.dll] Error 1
make[2]: Leaving directory '/home/TKB/src/mlt/src/modules/avformat'
make[1]: *** [all] Error 1
make[1]: Leaving directory '/home/TKB/src/mlt/src/modules'
make: *** [all] Error 1

dll 在该文件夹中。

EDIT5:看来我终于编译成功了!我将 LDFLAGS 更改为以下内容:

LDFLAGS+=-L/home/TKB/bin
LDFLAGS+=-lavformat-56 -lavcodec-56 -lavutil-54
LDFLAGS+=-lswscale-3
LDFLAGS+=-lavdevice-56

它没有错误地完成了。

谢谢Brian一直以来对我的帮助!

确保安装了 pkg-config:

http://www.mltframework.org/pub/Shotcut/SetupWindowsDev/pkg-config.exe

您应该能够从命令行 运行 pkg-config 并获得良好的响应。例如:

# pkg-config --modversion libxml-2.0
2.9.1
# pkg-config --modversion QtGui
4.8.6

如果您没有从 pkg-config 获得良好的响应,您可能需要设置 PKG_CONFIG_PATH 以指向每个依赖项的 .pc 文件。

此外,请仔细阅读 pkg-config 文档。对于 Windows:

,您可能需要考虑一些特殊的注意事项

http://linux.die.net/man/1/pkg-config

您还需要安装dlfcn-win32。来自 MLT Windows 说明:

  • 下载dlfcn-win32
  • cd ~/src/dlfcn-win32-r19
  • ./configure --enable-shared make all install
  • 要使其可重新分发,请将 /mingw/bin/libdl.dll 复制到您的构建目录。

如果您确实遵循了这些说明,也许您需要找到一个地方来放置 libdl.dll 以便链接器找到它。

对于“-lbz2”错误,您似乎需要下载、编译和安装 bzip2 库以匹配 ffmpeg 编译所针对的库: bzip2 1.0.6

查看您下载的 ffmpeg-shared 包附带的 README.txt 文件。有一长串外部库是针对 ffmpeg 编译的。 bzip2 是第一个。您可能需要 download/compile/install 更多这些。

编辑 3:

您不应同时指定 --avformat-shared 和 --avformat-static - 它们是互斥的。您可以尝试不指定它们。或者,尝试设置 --avformat-shared=$HOME/build/

编辑 4:

我认为您无法链接的原因是 Zeranoe 构建不再包含 pkg-config 文件 (.pc)。

http://ffmpeg.zeranoe.com/forum/viewtopic.php?f=7&t=532&hilit=pkg+config

MLT 配置脚本依赖于 pkg-config 来设置正确的链接器标志。可以扩展 MLT 配置脚本以允许用户指定正确的链接器标志。在那之前,我认为破解 config.mak(就像你所做的那样)将是让它在 Windows.

上运行的唯一方法

我很高兴你成功了。干杯!