【问题标题】:Qt application startup crashQt 应用程序启动崩溃
【发布时间】:2014-05-14 05:59:19
【问题描述】:

我正在做一个更大但仍然很小的游戏项目作为家庭作业。它基于 Qt 4.8.6,在 Windows 7 64 位上完美运行。它也可以在 64 位 Linux 上编译,但在启动时会崩溃。在不同的堆栈跟踪中,崩溃点似乎很常见,但我没有在网上找到我的案例,我不知道如何修复它。

我试过了

  • 重新编译项目。重新编译的 Qt。
  • 在网上搜索。再次。再次。
  • 在 gdb 中走来走去(将使用调试符号重新编译 qt)
  • 用 strace 观看,最后一个动作是加载 /usr/lib/libicudata.so.44

gdb 回溯:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000ecf720 in QResourceRoot::operator==(QResourceRoot const&) const ()
(gdb) bt
#0  0x0000000000ecf720 in QResourceRoot::operator==(QResourceRoot const&) const ()
#1  0x0000000000ecd175 in qRegisterResourceData (version=1, tree=0x10d8f60 "", name=0x10d8ee0 "", data=0x10d8320 "") at io/qresource.cpp:846
#2  0x0000000000bda227 in qInitResources_qmessagebox () at .rcc/debug-static/qrc_qmessagebox.cpp:257
#3  0x0000000000bda27a in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at .rcc/debug-static/qrc_qmessagebox.cpp:261
#4  0x0000000000bda2be in global constructors keyed to qrc_qmessagebox.cpp () at .rcc/debug-static/qrc_qmessagebox.cpp:270
#5  0x0000000000fee3e6 in __do_global_ctors_aux ()
#6  0x000000000040ee1b in _init ()
#7  0x0000000000000000 in ?? ()

(Qt不带“-debug”时的原文:http://pastebin.com/6GsKDM8d)

  • Application: public QApplication
  • 构造函数什么都不做,只是传递argcargv 向前。
  • 我没有全局Q 的东西。我一般没有全局的东西,只有一些简单的常量。

程序编译(每种示例):

  • uic:uic inc/ed/gomoku/ui/FEditProfile.ui -o inc/ed/gomoku/ui/FEditProfile.ui.h
  • moc:moc -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I../thirdparty/qt/include inc/ed/gomoku/ui/FEditProfile.h -o inc/ed/gomoku/ui/FEditProfile.moc.cpp
  • cxx:g++ -DDEBUG -g -o inc/ed/gomoku/ui/FEditProfile.moc.o -c -fmessage-length=0 -fpermissive -Wall -Wextra -Wno-long-long -Wno-variadic-macros -Wno-unused-local-typedefs -MMD -MP -MF"inc/ed/gomoku/ui/FEditProfile.moc.d" -MT"inc/ed/gomoku/ui/FEditProfile.moc.d" -Iinc/ed -I../utils/inc/ed -I../ejson/inc/ed -I../thirdparty/boost -I../thirdparty/qt/include -c inc/ed/gomoku/ui/FEditProfile.moc.cpp
  • cxx:g++ -DDEBUG -g -o src/ed/gomoku/ui/FEditProfile.o -c -fmessage-length=0 -fpermissive -Wall -Wextra -Wno-long-long -Wno-variadic-macros -Wno-unused-local-typedefs -MMD -MP -MF"src/ed/gomoku/ui/FEditProfile.d" -MT"src/ed/gomoku/ui/FEditProfile.d" -Iinc/ed -I../utils/inc/ed -I../ejson/inc/ed -I../thirdparty/boost -I../thirdparty/qt/include -c src/ed/gomoku/ui/FEditProfile.cpp
  • 链接:g++ -DDEBUG -g -o gomoku_client gomoku_client.a ../ejson/ejson.a ../utils/utils.a ../thirdparty/boost/stage/lib/libboost_regex.a ../thirdparty/boost/stage/lib/libboost_date_time.a ../thirdparty/boost/stage/lib/libboost_filesystem.a ../thirdparty/boost/stage/lib/libboost_system.a ../thirdparty/boost/stage/lib/libboost_thread.a ../thirdparty/boost/stage/lib/libboost_chrono.a ../thirdparty/qt/lib_lin64/libQtGui.a ../thirdparty/qt/lib_lin64/libQtCore.a -lpthread -lz -ldl -lX11 -lXft -lXext -lglib-2.0 -lgthread-2.0 -lgobject-2.0 -lSM

ldd 输出:

    linux-vdso.so.1 =>  (0x00007fff91fff000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007f51ce520000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007f51ce309000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007f51ce104000)
    libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f51cddc9000)
    libXft.so.2 => /usr/lib/libXft.so.2 (0x00007f51cdbb5000)
    libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f51cd9a2000)
    libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0x00007f51cd6c6000)
    libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x00007f51cd4c2000)
    libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x00007f51cd27a000)
    libSM.so.6 => /usr/lib/libSM.so.6 (0x00007f51cd072000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f51ccd5e000)
    libm.so.6 => /lib/libm.so.6 (0x00007f51ccadb000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f51cc8c5000)
    libc.so.6 => /lib/libc.so.6 (0x00007f51cc563000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f51ce75c000)
    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007f51cc32d000)
    libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f51cc0a5000)
    libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007f51cbe9b000)
    librt.so.1 => /lib/librt.so.1 (0x00007f51cbc92000)
    libICE.so.6 => /usr/lib/libICE.so.6 (0x00007f51cba77000)
    libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f51cb85b000)
    libpcre.so.3 => /lib/libpcre.so.3 (0x00007f51cb62a000)
    libuuid.so.1 => /lib/libuuid.so.1 (0x00007f51cb426000)
    libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f51cb1fd000)
    libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f51caffa000)
    libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f51cadf5000)

Qt 配置:./configure -prefix ~/local/qt -opensource -confirm-license -static -no-sql-sqlite -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -qt-zlib -qt-libpng -qt-libtiff -qt-libmng -qt-libjpeg -no-openssl -nomake demos -nomake examples -no-nis -no-cups -no-iconv -no-dbus -no-opengl

/proc/version:Linux version 2.6.32-5-amd64 (Debian 2.6.32-48squeeze4) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Mon Sep 23 22:14:43 UTC 2013

【问题讨论】:

  • Application.cpp:25 和 main.cpp:49 是什么?
  • @SebastianLange Application a(argc,argv);, Application::Application(int& argc, char ** argv): QApplication(argc, argv) { } 后者有点奇怪(int 引用),但应该不是问题。将修复并查看。
  • 在使用-debug 编译后,我有不同的堆栈跟踪。短了很多。添加为链接。
  • intref 没问题。这根本不应该崩溃,它是一个有效的实现。
  • 喵。重新编译所有内容并重新复制包含文件有所帮助。最后一步至关重要。感谢@SebastianLange 的努力

标签: c++ linux qt crash x86-64


【解决方案1】:

如果我们使用的 qt include 目录不完全适用于我们使用的库(.lib.a),则可能会发生神秘的崩溃。应用程序可以在没有任何警告的情况下编译和链接,但很容易出现意外崩溃。

【讨论】:

  • 当您混合使用二进制不兼容的 Qt 版本时,崩溃是意料之中的 :)
  • @KubaOber 我有适用于 Windows 和 Linux 的 4.8.6。构建时会生成不同的标头。我只看到使用#ifdefs 区分平台的库。现在我知道事实并非如此。
  • 已安装的 Qt 版本是一个独立的单元,用于特定的架构。如果您尝试以其他方式使用它,您将遇到无穷无尽的麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多