【问题标题】:Segmentation Fault (Core dumped) Wt With Qt helloqtSegmentation Fault (Core dumped) Wt With Qt helloqt
【发布时间】:2015-08-22 07:44:16
【问题描述】:

我之前写过,但细节没有解释。 我一步一步解释我的工作;

  1. Witty installation Guide Ubuntu

    我按照此页面中所说的内容进行了操作。

    sudo apt-get install gcc g++ libboost-all-dev cmake make sudo apt-get install libssl-dev libfcgi-dev sudo apt-get install libpq-dev libmysqlclient-dev firebird-dev sudo apt-get install libpng12-dev libgraphicsmagick1-dev libhpdf-dev libpng12-dev libpango1.0-dev mesa-common-dev sudo apt-get install asciidoc libqt4-dev sudo apt-get install doxygen graphviz

    wget -c http://kent.dl.sourceforge.net/sourceforge/witty/wt-3.3.4.tar.gz tar xvxf wt-3.3.4.tar.gz

    cd wt-3.3.4 mkdir 构建 光盘构建 制作.. 制作 制作-C例子

并测试 helloqt.wt 测试

./helloqt.wt --http-port 10000 --http-addr 0.0.0.0 --docroot .

一切正常

然后我为 Qt 事件循环工作更改了一些代码

// Needed when using WQApplication with Qt eventloop = true
#include <QApplication>

Dictionary::Dictionary(const WEnvironment& env)
  : WQApplication(env , true )
{
  /*
   * Note: do not create any Qt objects from here. Initialize your
   * application from within the virtual create() method.
   */
}

.
.
.
int main(int argc, char **argv)
{
  // Needed for Qt's eventloop threads to work
  QApplication app(argc, argv);

  return WRun(argc, argv, &createApplication);
}

结果仍然很好,一切正常。事件循环(信号/插槽工作)

然后我会用

make clean

在 cmakefiles.txt 中添加一行 QtNetwork

.
.
.
IF(ENABLE_QT4)
  FIND_PACKAGE(Qt4 REQUIRED QtCore QtGui QtNetwork)

  IF(QT_FOUND)
    INCLUDE(${QT_USE_FILE})
  ENDIF(QT_FOUND)
ENDIF(ENABLE_QT4)
.
.
.

并添加到 wtwithqt 示例 cmakelist.txt ${QT_QTNETWORK_LIBRARY}

  FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtNetwork )

  SET(QT_USE_QTNETWORK true)

  INCLUDE(${QT_USE_FILE})

到下面

IF(COMMAND cmake_policy)
  CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND cmake_policy)

SET(BUILD_WTWITHQT true)
IF (NOT MULTI_THREADED_BUILD)
  SET(BUILD_WTWITHQT false)
ENDIF (NOT MULTI_THREADED_BUILD)
IF (NOT QT_FOUND)
  SET(BUILD_WTWITHQT false)
ENDIF (NOT QT_FOUND)

IF (NOT BUILD_WTWITHQT)

  MESSAGE(STATUS "** Not building wtwithqt example.")
  MESSAGE(STATUS "   wtwithqt example requires a Qt4 installation.")

ELSE (NOT BUILD_WTWITHQT)




  MESSAGE("\n\n " + ${QT_QTCORE_LIBRARY} + " \n" + ${QT_QTGUI_LIBRARY} + "\n" +  ${QT_QTNETWORK_LIBRARY} + "\n" +    ${QT_LIBRARIES}  + "\n\n" )

  FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtNetwork )

  SET(QT_USE_QTNETWORK true)

  INCLUDE(${QT_USE_FILE})

  SUBDIRS(lib)

  ADD_DEFINITIONS(-DWT_NO_SLOT_MACROS)

  QT4_GENERATE_MOC(${CMAKE_CURRENT_SOURCE_DIR}/QtObject.h
                   ${CMAKE_CURRENT_BINARY_DIR}/moccedQtObject.C)

  WT_ADD_EXAMPLE(helloqt.wt
    hello.C
    QtObject.C
    ${CMAKE_CURRENT_BINARY_DIR}/moccedQtObject.C
  )

  TARGET_LINK_LIBRARIES(helloqt.wt
    wtwithqt
    ${QT_QTCORE_LIBRARY}
    ${QT_QTGUI_LIBRARY}
    ${QT_QTNETWORK_LIBRARY}
    ${QT_LIBRARIES}
  )

  #
  # If you have Wt installed somehwere, you should use the
  # installed Wt header files for your own Wt projects.
  # e.g. INCLUDE_DIRECTORIES(/usr/local/wt/include)
  # instead of the following:
  #
  INCLUDE_DIRECTORIES(
    ${WT_SOURCE_DIR}/src
    ${CMAKE_CURRENT_SOURCE_DIR}/lib
    ${QT_QTCORE_INCLUDE_DIR} 
    ${QT_QTNETWORK_INCLUDE_DIR} 
    ${QT_INCLUDE_DIR}

  )

ENDIF (NOT BUILD_WTWITHQT)

并添加到 QTcpSocket 以在下面运行 QtObject.h

// 这可能看起来像 C 代码,但实际上是 -- C++ --

#ifndef QTOBJECT_H_
#define QTOBJECT_H_

#include <QThread>
#include <QTcpSocket>

class Dictionary;

/*! \class QtObject
 *  \brief A simple Qt object with sample signal and slot.
 *
 * This simple object class demonstrates that the Qt signal/slot
 * mechanism may be used alonglisde Wt's signal/slot mechanism.
 */
class QtObject : public QObject
{
  Q_OBJECT;

public:
  QtObject(Dictionary *wt_, QObject *parent = 0);

  void passGreet(const QString&);

  QTcpSocket* socket;

signals:
  void greet(const QString&);

public slots:
  void doGreet(const QString&);
  void Connected();

private:
  Dictionary *wt_;
};

#endif // QTOBJECT_H_

QtObject.C 文件

 #include "HelloApplication.h"
#include "QtObject.h"
#include <QHostAddress>

QtObject::QtObject(Dictionary *wt, QObject *parent)
  : QObject(parent),
    wt_(wt)
{ 

    socket = new QTcpSocket();

    QHostAddress adr;

    adr.setAddress("192.168.0.2");

    socket->connectToHost(adr,17776);


    QObject::connect(socket,SIGNAL(connected()),this,SLOT(Connected()));

}

void QtObject::passGreet(const QString& name)
{
  emit greet(name);
}

void QtObject::doGreet(const QString& name)
{
  wt_->doGreet(name);
}


void QtObject::Connected(){

    std::cout << "\n\nCONNNECTED\n\n";
    emit greet(QString("QString"));
}

从现在开始

cml@cml-All-Series:~/wt-3.3.4/build$ make clean
cml@cml-All-Series:~/wt-3.3.4/build$ cmake ..
cml@cml-All-Series:~/wt-3.3.4/build$ make -j8
cml@cml-All-Series:~/wt-3.3.4/build$ make -C examples/wtwithqt


cml@cml-All-Series:~/wt-3.3.4/build/examples/wtwithqt$ ./helloqt.wt charts.wt --http-port 10000 --http-addr 0.0.0.0 --docroot .
[2015-Aug-22 10:34:04.692004] 3116 - [info] "WServer/wthttp: initializing built-in wthttpd"
[2015-Aug-22 10:34:04.693292] 3116 - [info] "wthttp: started server: http://0.0.0.0:10000"

当点击浏览器 0.0.0.0:10000 页面正在传入和

socket 发射 Connected() 信号和 Connected() SLOT 工作

将屏幕打印到std::cout &lt;&lt; "\n\nCONNNECTED\n\n";

和应用

崩溃了。分段错误和核心转储

我找不到什么问题?

我调试 Qt Creator

WWebWidget.C 文件停在那里

    bool WWebWidget::canOptimizeUpdates()
    {
->      return WApplication::instance()->session()->renderer().preLearning();
    }

Qt Creator 调试器说->

The inferior stopped because it received a signal from the Operating System.

Signal name : 
SIGSEGV
Signal meaning : 
Segmentation fault

【问题讨论】:

  • 你是在调试器中运行的吗?
  • 如何调试它?不知道怎么调试的
  • 运行 ldd ./helloqt.wt 并找到所有必要的库

标签: c++ qt wt


【解决方案1】:

There talking about the solution

在我的代码中,我在没有失败段错误后删除 WText 对象...

这对我来说不是解决方案,但我可以使用它

【讨论】:

    【解决方案2】:
    Wt::WApplication* app = Wt::WApplication::instance();
    
    app->enableUpdates(true);
    
    Wt::WApplication::UpdateLock uilock(app);
    
    
    if( uilock ){
       button->setText("Test"); //Here is Editable Widget
       app->trigerUpdate(); 
       app->enableUpdates(false);
    }
    

    对于大型工作,您锁定应用程序并

    控制是否锁定改变任何东西 ServerPUSH.c

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      相关资源
      最近更新 更多