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

Posted

技术标签:

【中文标题】基本 qt 应用程序未运行但已编译【英文标题】:Basic qt app doesn't run but compilied 【发布时间】:2015-06-29 11:18:54 【问题描述】:

我创建了简单的 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 是正确的消息吗?我的 PC 中有两种环境 Cygwin 和原生 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\4.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();

【问题讨论】:

您是否尝试构建和运行其中一个示例应用程序以确保您的 Qt Creator 配置正确? @nnb,感谢参与,我没有尝试过,导致非常基本的应用程序运行失败。根据定义,基本应用程序是很好的工作示例 也许您的 cygwin 配置与 Qt Creator 冲突。您是否尝试使用 Qt Creator 设置来设置工具链部分并从 Qt Creator 构建它(选项构建和运行,设置编译器等)?我看到你从命令行手动运行 make .. 你也可以在 Windows 事件查看器中检查问题出了什么问题(可能只是由于错误设置工具链路径而丢失了一些库) @otopolsky ,我已经从 cygwin 卸载了 binutils 并使用 Qt Creator 构建了应用程序——没关系。我在 Windows 日志中找到了消息,请参阅编辑 异常 0xc00..5 表示访问冲突.. 我只是在猜测 - 它可能是由错误的代码引起的,也可能是由损坏的 (dll) 文件引起的。也许你可以发布一些代码来检查它是否真的正确。 【参考方案1】:

使用与构建库相同的编译器版本很重要。 Here 有关用于构建 qt 库的版本的信息。跟随我做出此决定的一些有用网站:qt centre forum 和 another one。

【讨论】:

以上是关于基本 qt 应用程序未运行但已编译的主要内容,如果未能解决你的问题,请参考以下文章

Qt 程序在 Windows 下的发布

一个简单的 qt 程序未运行并显示“分段错误”的错误消息

Qt 应用程序未运行

QML 模块未安装错误:在嵌入式 Linux 上运行 Qt 应用程序

QT程序编译生成后在自己机器上能够运行,却无法在别人机器上运行

在 Docker 中运行一个基本的 Qt 应用程序