在 Qt C++ 中访问 GStreamer 库时出错 - 程序在调试时被代码 0xc0000135 激发

Posted

技术标签:

【中文标题】在 Qt C++ 中访问 GStreamer 库时出错 - 程序在调试时被代码 0xc0000135 激发【英文标题】:Error accessing GStreamer Library in Qt C++ - Program excited with code 0xc0000135 when Debugging 【发布时间】:2015-08-11 17:38:01 【问题描述】:

我想使用 gstreamer 库进行视频编程,我读到 Qt5.5.0 提供了对 gstreamer-1.0 的支持,这是我使用的库。我先下载了 1.0.7 版本,但出现以下错误,所以我下载了最新版本 1.5.2,我现在正在尝试使用。

我设法链接了 gstreamer 库头文件,所以我没有构建它,只是包含它的路径并访问头文件和库。无论如何,现在我有一个错误程序已意外完成。当我尝试调试它时,我在弹出窗口中收到以下错误: 在启动程序时出现代码 0xc0000135

关于一般消息:

:1:24: 只读版本 1.1 部分。 :10:5: 只需要 Component 和 ModuleApi 对象定义。

我阅读了许多与此错误相关的问题,但没有任何帮助,我认为这是 gstreamer 库的错误,但也可能是编译器/调试器错误,正如我在某些线程中看到的那样。

我检查了我的 PATH 变量,因为我也无法在 Qt 之外运行程序(通过尝试在构建的调试文件夹中运行 .exe) - 错误:库 Qt5Cored.dll 丢失 - 我找到了这个路径:

C:\Qt\Qt5.5.0_android\5.5\mingw492_32\lib; C:\Users\user\Documents\build-GStreamer-test5-Desktop_Qt_5_5_0_MinGW_32bit-Debug; C:\Qt\Qt5.5.0_Android\5.5\mingw492_32\bin; C:\Qt\Qt5.5.0_Android\Tools\mingw492_32\bin; C:\Windows\system32; C:\视窗; C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0; C:\Program Files\Skype\Phone\ (我不知道为什么包含这个,但我检查时它就在那里)

我对 Qt 比较陌生,以前从未遇到过这个错误。如果您需要任何代码:

.pro:

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = GStreamer-test5
TEMPLATE = app

SOURCES += main.cpp
mainwindow.cpp

HEADERS += mainwindow.h

FORMS += mainwindow.ui

INCLUDEPATH += C:/gstreamer/1.0/x86/include/gstreamer-1.0
C:/gstreamer/1.0/x86/lib/gstreamer-1.0/include
C:/gstreamer/1.0/x86/include/glib-2.0
C:/gstreamer/1.0/x86/lib/glib-2.0/include

LIBS += -L C:/gstreamer/1.0/x86/lib/ -lgstreamer-1.0

和.main:

#include "mainwindow.h"
#include <QApplication>

#include <QDebug>

#include <stdio.h>
#include "gst/gst.h"

void *__gxx_personality_v0;

int main(int argc, char *argv[])

QApplication a(argc, argv);
MainWindow w;
w.show();

const gchar *nano_str;
guint major, minor, micro, nano;

gst_init (&argc, &argv);

gst_version (&major, &minor, &micro, &nano);

if (nano == 1)
nano_str = "(CVS)";
else if (nano == 2)
nano_str = "(Prerelease)";
else
nano_str = "";

// printf ("This program is linked against GStreamer %d.%d.%d %s\n", major, minor, micro, nano_str);

qDebug() << "This program is linked against GStreamer %d.%d.%d %s\n", major, minor, micro, nano_str ;

return a.exec();

首先,我遇到了错误: undefined reference to `__gxx_personality_v0' ,但通过添加 *void __gxx_personality_v0; 来修复它,虽然我不知道它是什么。

我已经为这个问题苦苦挣扎了三天。任何帮助表示赞赏,或者如果您可以通过一些代码帮助我了解如何访问头文件和库,或者调试器选项/PATH 的配置必须如何。

我在 Android 上使用 Qt5.5.0,在 Windows 上我使用 MinGW 4.9.2 32 位 编译器和 GNU gdb 7.8 作为调试器。

提前致谢!

【问题讨论】:

添加void *__gxx_personality_v0; 就像在断腿上贴创可贴——你走路时仍然会摔倒。该符号是编译器标准库的一部分,您必须链接到它。否则它几乎肯定会在启动过程中崩溃。 那么这种情况我该怎么办,我的意思是断腿可以修复,还是我应该继续使用创可贴? :) 【参考方案1】:

我在同时使用 Qt 和 Gstreamer 的项目中遇到了类似的问题。

“undefined reference to `__gxx_personality_v0'”错误的原因是来自官方网站的 Qt 和 GStreamer for windows 是使用不同的编译器构建的,并且它们的 libstdc++ 库不兼容 - 它们使用不同的异常处理方法。 实际上,GStreamer 是纯 C 库。它唯一用 C++ 编写的组件是 taglib 库。如果你使用你的 MinGW 编译器从源代码构建这个库,然后在 GStreamer 文件夹中替换它,不兼容的问题将得到解决。 更详细的信息你可以在这里阅读:https://github.com/knowthelist/knowthelist。

【讨论】:

【参考方案2】:

我设法解决了上述问题。我必须在 .exe 文件夹(build-debug 文件夹)中包含所有包含的 dll,所以我尝试从那里运行 .exe,而不是从 Qt 运行它,并且缺少 dll 的一些错误给了我的名称dll。我在我的库 bin 文件夹中找到了一些并下载了一些,现在一切似乎都很好:)

【讨论】:

以上是关于在 Qt C++ 中访问 GStreamer 库时出错 - 程序在调试时被代码 0xc0000135 激发的主要内容,如果未能解决你的问题,请参考以下文章

使用 GstDiscoverer (GStreamer) 的分段错误

如何在 Qt5.5 中使用 gstreamer1.0 而不是 0.10?

如何将 gstreamer 1.0 视频元素添加到 qt5 应用程序

如何在 Qt 中实现基于 GStreamer 的视频小部件?

Qt+GStreamer:如何在播放实时视频流时拍摄快照

使用 gstreamer 在 android 上录制音频(使用 Qt5)