在Windows上的qt项目中包括ffmpeg会导致程序意外完成
Including ffmpeg in qt project on windows causes the program to unexpectedly finish
我正在尝试将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。
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 多线程程序中出现意外的内存泄漏
- C++ 程序意外退出
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- QT应用程序意外的语言事件
- 程序意外终止C
- 双精度数字程序意外值
- 查找素数的程序意外停止
- 程序意外地完成了-QT创建者
- 当我在递归函数中调用 return 时,我的程序意外完成
- Qt程序意外完成
- 在Windows上的qt项目中包括ffmpeg会导致程序意外完成
- 登录用户:程序意外完成
- Qt GUI应用程序意外结束
- 带Qt的OpenCV:程序意外完成
- C++程序意外地阻止/抛出
- QSqlDatabse:程序意外完成
- qt运行时错误,程序意外完成
- 程序意外完成