在Windows上的qt项目中包括ffmpeg会导致程序意外完成

Including ffmpeg in qt project on windows causes the program to unexpectedly finish

本文关键字:程序 意外 ffmpeg 上的 Windows qt 项目 包括      更新时间:2023-10-16

我正在尝试将ffmpeg包含在Windows上的qt项目中。我正在运行QT4并在32位Windows 7上使用Microsoft Visual Compiler 2010进行编译。我正在尝试包含 ffmpeg 2.8,我得到了开发并从 zeranoe 共享下载。当我运行它时,我得到以下输出:

Starting (executable path)...
The program has unexpectedly finished.
(executable path) exited with code -1073741819

我能够通过以下方式生成此输出:

ffmpeg_test.pro:

QT += core
TARGET = ffmpeg_test
INCLUDEPATH += (ffmpeg dev path)/include
LIBS += -L(ffmpeg dev path)/lib
LIBS += -lavformat
SOURCES += main.cpp

主.cpp:

extern "C"
{
#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
#endif
#include <libavformat/avformat.h>
}
int main(int argc, char *argv[])
{
  av_register_all();
  return 0;
}

我已经将 ffmpeg 共享箱中的.dll文件放入 QT 构建ffmpeg_test.exe到的同一文件夹中。我还确认它们是使用依赖 walker 找到的,当它们不在那个目录中时会显示一个问号,当它们不在那个目录中时会显示 avformat-56.dll 文件路径(找到 .dll 文件的事实不会影响程序的输出(。

依赖沃克确实揭示了一些奇怪的事情正在发生,因为没有预期的函数,但是在avformat-56中找到的函数.dll看起来是正确的。我还在avformat.lib上运行了Dumpbin.exe/EXPORTS,它看起来也不错(如果有帮助,我可以发布输出(。值得注意的是,我已经在这个机器上的另一个应用程序中包含了这个版本的ffmpeg,但是它不是一个qt项目。该项目使用 CMake 而不是 QMake 生成其 make 文件,并且是使用 Visual C++ 2010 而不是 QT Creator 构建Microsoft。

我还在qt中包含其他.lib/.dll对,它们没有问题。我注意到这些对有两个区别。首先在 ffmpeg-dev lib 文件夹中,而不是只有 .lib 文件(就像我所有其他 .lib/.dll 对一样(,我还有一个 .def 和一个 .dll.a 文件为每个库。第二个 ffmpeg 是一个 c 库,而我所有其他包含的库都是 c++。

3月29日更新

我尝试将 .pro 中的 LIBS 行替换为以下两个:

LIBS += (ffmpeg dev path)/lib/avformat.lib

LIBS += (ffmpeg dev path)/lib/libavformat.dll.a

两者都给出相同的错误消息。我也尝试将以下内容添加到我的 .pro 文件中,但也没有效果。

DEFINES += __STDC_CONSTANT_MACROS QMAKE_CXX_FLAGS += -D_STDC_CONSTANT_MACROS

此外,我尝试按照 ffmpeg 网站上的建议将#define inline __inline添加到 main.cpp。任何尝试的想法将不胜感激!

更新 3/31

我试图从一个新的 Windows 构建环境重新开始,但上面的测试代码的结果保持不变。(新环境能够运行hello world程序(。

我设置此环境的过程是安装新版本的 32 位 Windows 7。从 Visual Studio 2010 Express 一体式 ISO 安装 Visual C++ 2010 Express。为 32 位窗口和 Visual Studio 2010 安装 Qt 4.8.6。最后安装 Qt Creator 2.5.2。为了设置Qt创建器,我进入了工具>选项,并告诉它在哪里可以找到Qt 4.8.6 qmake。我从Zeranoe下载了ffmpeg 2.8的开发并共享了版本。我缺少stdint.h和inttypes,所以我下载了它们并将文件放在/include/libavutil中。然后我更正了任何抱怨到"stdint.h"等的头文件。然后,我将 ffmpeg-2.8-win32-shared/bin 中的 dll 文件放入 qt 构建 ffmpeg_test ffmpeg_test-build-desktop-Qt_4_8_6__4_8_6__Release/release 的文件夹中。

问题是ffmpeg是用MinGW编译器编译的,有时用不同的编译器编译的库可能并不总是兼容的。我能够通过获取MinGW编译器并为MinGW设置Qt来使我的测试程序正确运行。此外,我的ffmpeg版本不需要涉及stdint.h或inttypes.h的更改。这个版本的ffmpeg如何使用MSVC和cmake进行编译对我来说仍然是一个谜。对于前进的道路,问题是切换到 MinGW 编译器是否是一种选择,或者我是否需要为 MSVC 编译 ffmpeg。