基本 qt 应用程序没有 运行 但已编译

Basic qt app doesn't run but compilied

我已经创建了简单的 qt 应用程序:只是简单的小部件。它编译得很好,没有任何问题。编译如下:

mingw32-make -j5 -f Makefile.Release mingw32-make[1]: Entering directory C:/Users/juriy/test' g++ -c -pipe -O2 -frtti -fexceptions -mthreads -Wall -Wextra -DUNICODE -DQT_DLL -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I'../../../Qt/4.8.6/include/QtCore' -I'../../../Qt/4.8.6/include/QtGui' -I'../../../Qt/4.8.6/include' -I'../../../Qt/4.8.6/include/ActiveQt' -I'release' -I'.' -I'../../../Qt/4.8.6/mkspecs/win32-g++' -o release/main.o main.cpp

当我在 QtCreator 中启动应用程序时,它会像这样进行调试:

Debugging starts
Debugging has failed
Debugging has finished

没有像这样的调试模式:

Starting C:\Users\juriy\test\release\test.exe...
The program has unexpectedly finished.
C:\Users\juriy\test\release\test.exe crashed

在 GDB 下:

GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32"...
BFD: BFD (GNU Binutils) 2.18.50.20080226 internal error, aborting at coffcode.h line 842 in handle_COMDAT

BFD: Please report this bug.

看来我为这样的Qt版本使用了错误的工具。我的工具:来自 QtSDK 1.2.1Qt 4.8.6 的整个工具链。

我尝试了 Cygwin 包 makeMinGW binutils,但由于缺少 cc1plus 选项 -fno-keep-inline-dllexport,它被滥用了。 请帮助理解工具和 运行 应用程序的依赖关系。

上面指出的 gdb 配置为 i686-pc-mingw32 的消息是否正确?我的电脑有Cygwin 和native Windows 两个环境。 C:\QtSDK\mingw\bin 中没有类似 i686-pc-ming32 的名称,而是 ar.exec++filt.exe 等简单名称。像 i686-*-mingw32-* 这样的形式在 Cygwin env 中有程序。

编辑:(Записи в журнале сообщений Windows)

Имя сбойного приложения: test.exe, версия: 0.0.0.0, отметка времени: 0x55912535
Имя сбойного модуля: QtCored4.dll, версия: 4.8.6.0, отметка времени 0x00000000
Код исключения: 0xc0000005
Смещение ошибки: 0x00106acf
Идентификатор сбойного процесса: 0x1340
Время запуска сбойного приложения: 0x01d0b26aab6adef8
Путь сбойного приложения: C:\Users\juriy\test\debug\test.exe
Путь сбойного модуля: C:\Qt.8.6\bin\QtCored4.dll
Код отчета: ec353438-1e5d-11e5-b20d-f46d04d35ed7

编辑:澄清情况的一些来源。

//widget.h
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
};
//widget.cpp
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

// main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

使用与构建库相同版本的编译器很重要。 Here information about which version was used for building qt libraries. Some useful sites that follow me to this decision: qt centre forum and another one.