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

时间:2016-02-08 20:14:33

标签: c++ qt visual-studio-2010 dll ffmpeg

我正在尝试将ffmpeg包含在Windows上的qt项目中。我正在运行QT4并在32位Windows 7上使用microsoft visual compiler 2010进行编译。我正在尝试包含ffmpeg 2.8,我从dev获得了sharedzeranoe次下载。当我运行它时,我得到以下输出:

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

main.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共享bin中的.dll文件放入QT构建ffmpeg_test.exe的同一文件夹中。我还确认它们是使用依赖性walker找到的,当它们不在该目录中时显示问号,并且当它们存在时显示avformat-56.dll文件路径(发现.dll文件的事实不会影响输出该计划)。

Dependency walker确实显示出一些奇怪的事情,因为没有预期的函数,但avformat-56.dll中的函数看起来是正确的。我也在avformat.lib上运行了Dumpbin.exe / EXPORTS,它看起来也很好(我可以发布输出,如果它会有所帮助)。值得注意的是,我已将此版本的ffmpeg包含在此机器的不同应用程序中,但它不是qt项目。该项目使用CMake而不是QMake生成其make文件,并使用Microsoft Visual C ++ 2010而不是QT Creator构建。

我还在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 website的建议将#define inline __inline添加到main.cpp。任何想要尝试的想法都会非常感激!

更新3/31

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

我设置此环境的过程是安装新版本的32位Windows 7.从Visual Studio 2010 Express All-in-one ISO安装Visual C ++ 2010 Express。安装Qt 4.8.6 for 32 bit windows and Visual Studio 2010。最后安装Qt Creator 2.5.2。为了设置Qt创建者,我使用了tools-&gt;选项并告诉它在哪里可以找到Qt 4.8.6 qmake。我从Zeranoe下载了ffmpeg 2.8的devshared版本。我失踪了stdint.h and inttypes所以我下载了它们并将文件放在/ include / libavutil中。然后我纠正了抱怨的任何头文件到&#34; stdint.h&#34;等。然后我把ffmpeg-2.8-win32-shared / bin中的dll文件放到qt构建的文件夹中ffmpeg_test ffmpeg_test-build-desktop-Qt_4_8_6__4_8_6__Release / release。

1 个答案:

答案 0 :(得分:0)

问题是ffmpeg是使用MinGW compiler编译的,有时库是使用不同的编译器may not always be compatible编译的。通过获取MinGW编译器并为MinGW设置Qt,我能够正确运行我的测试程序。我的ffmpeg版本也不需要涉及stdint.h或inttypes.h的更改。这个版本的ffmpeg如何能够使用MSVC和cmake进行编译对我来说仍然是个谜。对于前进的路径,问题是如果切换到MinGW编译器是一个选项,或者我是否需要为MSVC编译ffmpeg。