c++ - 在windows上的qt项目中包含ffmpeg导致程序意外结束

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

我正在尝试在 Windows 上的 qt 项目中包含 ffmpeg。我正在运行 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

主要.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 构建到的同一文件夹中。我还确认它们是使用 dependency walker 找到的,当它们不在该目录中时显示问号,当它们在该目录中时显示 avformat-56.dll 文件路径(找到 .dll 文件的事实不会影响输出的程序)。

Dependency walker 确实揭示了一些奇怪的事情正在发生,因为没有预期的函数,但在 avformat-56.dll 中找到的函数看起来是正确的。我还在 avformat.lib 上运行了 Dumpbin.exe/EXPORTS,它看起来也不错(如果有帮助,我可以发布输出)。值得注意的是,我已将此版本的 ffmpeg 包含在 native 的不同应用程序中,但它不是 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 开发路径)/lib/avformat.lib

LIBS += (ffmpeg 开发路径)/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 Creator,我进入了工具-> 选项并告诉它在哪里可以找到 Qt 4.8.6 qmake。我下载了 devshared从 Zeranoe 为 ffmpeg 2.8 构建。我失踪了stdint.h and 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 compiler 编译的有时使用不同编译器编译的库 may not always be compatible .通过获取 MinGW 编译器并为 MinGW 设置 Qt,我能够使我的测试程序正确运行。此外,我的 ffmpeg 版本不需要涉及 stdint.h 或 inttypes.h 的更改。这个版本的 ffmpeg 如何能够使用 MSVC 和 cmake 进行编译对我来说仍然是个谜。对于前进的道路,问题是是否可以选择切换到 MinGW 编译器,或者我是否需要为 MSVC 编译 ffmpeg。

关于c++ - 在windows上的qt项目中包含ffmpeg导致程序意外结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35278460/

相关文章:

c++ - 如何确定字符串是否为 C++ 中的数字?

.net - Windows窗体控件库;托管和非托管

qt - 恢复 Qt Creator 默认布局

c++ - 如何更改 QDoubleSpinBox 的大小?

visual-studio-2010 - VS2010 Intellitrace,你真的能让调试器倒带吗?

visual-studio - 如何在Visual Studio中同步代码窗口和解决方案资源管理器?

visual-studio-2010 - 将数据文件添加到 cmake 生成的项目

c++ - Segmentation Fault 删除节点

c++ - 如何使用QMediaPlayer播放流媒体音频?

c++ - Visual C++ 2010 速成版 : How to use with Qt?