gpt4 book ai didi

c++ - 在 Qt 中使用信号会破坏 DLL

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:01 25 4
gpt4 key购买 nike

我在 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.

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

经过一些测试后,我发现问题在于在信号中使用 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程序是Debug还是Release好像没有影响。我没有更改任何这些配置的任何默认设置(除了一些绝对与它无关的事情)。

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

qmake.exe "D:\Dev\Qt Workspace\ArduGui\ArduGui.pro" -r -spec win32-msvc2013 "CONFIG+=debug" "CONFIG+=qml_debug"

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

所以在这一点上我正在碰壁。有没有人有这方面的经验或可以就如何调试问题提出建议?

更多信息:

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

最佳答案

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

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

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

关于c++ - 在 Qt 中使用信号会破坏 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35683502/

25 4 0
文章推荐: java - 无法使用包中的方法将对象存储在 List 中?