在Qt中使用信号会破坏DLL



我在Visual Studio 2013中运行一个模拟程序,我想要一个简单的GUI来输出/输入数据。

由于我知道一些Qt,我决定用Qt Creator编写一个小的Qt5程序,将其构建为.dll并将此.dll链接到我的程序中。然后,程序调用初始化函数来启动 GUI。

总的来说,这工作得很好。GUI就像独立的Qt程序一样工作。但是,一旦我向Qt.dll添加了自定义信号,如下所示:

//File.h
class MainGui : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainGui(QWidget *parent = 0);
    ~MainGui();
signals:
    void addItemSignal(QGraphicsView* it);
private slots:
    void addItemImpl(QGraphicsView* it);
private:
    Ui::MainGui *ui;
};
//File.cpp
void MainGui::addItemImpl(QGraphicsView *it)
{
    //do anything
}
MainGui::MainGui(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainGui)
{
    QObject::connect(this, &MainGui::addItemSignal,
                     this, &MainGui::addItemImpl);
}
MainGui::~MainGui()
{
    delete ui;
}

尝试启动主程序时,我最终收到以下错误消息:

The procedure entry point  could not be located in the dynamic link library e:......MyQtLibrary.dll.
"

点"和"可能"之间的两个空格不是错误 - 似乎由于某种原因,入口点根本没有设置为任何东西。

经过一些测试,我发现问题在于在信号中使用Qt类。以下工作正常:

//File.h
class MainGui : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainGui(QWidget *parent = 0);
    ~MainGui();
signals:
    void addItemSignal(void* it);
private slots:
    void addItemImpl(void* it);
private:
    Ui::MainGui *ui;
};
//File.cpp
void MainGui::addItemImpl(void*it)
{
    //do anything
}
MainGui::MainGui(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainGui)
{
    QObject::connect(this, &MainGui::addItemSignal,
                     this, &MainGui::addItemImpl);
}
MainGui::~MainGui()
{
    delete ui;
}

这不仅会影响自定义信号,还会影响内置信号:

QObject::connect(models, &QStandardItemModel::dataChanged,[this](a b, x y){
        //do something
    });

这也打破了.dll。

我还注意到,我必须在Qt Creator中完全重建.dll才能解决问题。删除任何有问题的信号并仅构建并不能解决问题。

仅当 Qt .dll内置于调试配置中时,才会发生此错误。发布配置运行良好。无论 MSVC 程序是调试还是发布似乎都没有效果。我没有更改这些配置中的任何一个的任何默认设置(除了一些绝对与它无关的事情)。

我在Qt Creator中发现两种配置之间的唯一区别是qmake的调用:

qmake.exe "D:DevQt WorkspaceArduGuiArduGui.pro" -r -spec win32-msvc2013 "CONFIG+=debug" "CONFIG+=qml_debug"

这是对调试配置的调用。在"发布"中,缺少两个调试配置标志。但是当我弄乱 qmake 参数时,结果并没有改变。调试配置将始终导致入口点错误,无论是否存在CONFIG+=debugCONFIG+=qml_debug。同样,即使添加了两个标志,发布也将始终有效。

所以此时我正碰壁。是否有人对此有经验或可以建议有关如何调试问题的选项?

更多信息:

我使用的是Windows 10,MSVC 2013和Qt Creator 3.6以及Qt 5.5.1。.exe和.dll都是通过各自的 IDE 使用 MSVC++ 12.0 编译器编译的。

如果它适用于void*但不适用于作为参数传递的 QT 类指针,我想您尚未注册该类以便能够在信号/插槽机制中使用它:

qRegisterMetaType<QGraphicsView *>("QGraphicsView*");

请务必在首次使用此信号之前调用此函数。虽然我不确定这是您所有问题的原因。

相关内容

  • 没有找到相关文章

最新更新