c++ - 在 Windows 上构建 MLT 框架时出错

标签 c++ libraries mlt

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

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

$HOME = C:\MinGW\msys\1.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

同时,因为我很困惑,所以我在 bin 中有相同的文件夹( libincludeshare$HOME/ ) 。

然后我有$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

编辑2:我添加了dlfcn-win32bin , libinclude到相应的bin , libinclude文件夹位于 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:现在我收到以下错误: 编译代码运行后(它生成 .o),我在 avformat 模块的每个文件中都得到“对‘ffmpeg_function’的 undefined reference ”。我注意到它正确地定位了包含,因此问题一定是在查找库上。

我注意到 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 进行全部安装
  • 要使其可重新分发,请将/mingw/bin/libdl.dll 复制到您的构建目录。

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

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

查看您下载的 ffmpeg 共享包附带的 README.txt 文件。 ffmpeg 编译的外部库有一长串。 bzip2 是第一个。您可能需要下载/编译/安装更多这些内容。

编辑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 上运行的唯一方法。

我很高兴你能让它发挥作用。干杯!

关于c++ - 在 Windows 上构建 MLT 框架时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460171/

相关文章:

c++ - 运行时检查失败 #2 - 变量 'x' 周围的堆栈已损坏

ubuntu - 如何使用 dllimport 解决 DllNotFoundException? (单声道)

media-player - 将熔化输出保存到另一个 avi/mp4 文件

c++ - Mlt 框架 : Crashes while playing video

c++ - 应用世界变换

c++ - 椭圆内部的颜色是什么?

c++ - 在 C++ 中为文件 I/O 包含其他文件

c - 如何知道我是否有 C 库?

Java:如何向makefile添加多个外部库?

video-processing - MLT 框架项目的实际内存使用情况?