我在Visual Studio 2013中运行了一个模拟程序,我想要一个简单的GUI来输出/输入数据。在Qt中断中使用信号DLL
由于我知道一些Qt,我决定在Qt Creator中编写一个小Qt5程序,将其构建为.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来解决这个问题。消除任何有问题的信号,只是建设并没有解决这个问题。
错误只发生在Debug配置中的Qt .dll中。发布配置运行良好。 MSVC程序是调试还是发布似乎没有效果。我没有改变任何一种配置的默认设置(除了一些与它无关的事情之外)。
我Qt Creator中发现两个配置之间唯一的区别是qmake的的呼叫:
qmake.exe "D:\Dev\Qt Workspace\ArduGui\ArduGui.pro" -r -spec win32-msvc2013 "CONFIG+=debug" "CONFIG+=qml_debug"
这是该呼叫的调试配置。在Release中,缺少两个调试配置标志。但是当我混淆了qmake参数时,结果并没有改变。无论是否存在CONFIG+=debug
或CONFIG+=qml_debug
,调试配置都会导致入口点错误。同样,即使添加了两个标志,Release也会一直工作。
所以在这一点上,我跑在墙上。有没有人有这方面的经验或可以建议如何调试问题的选项?
一些更多的信息:
我使用的是Windows 10,MSVC 2013和Qt Creator 3.6使用Qt 5.5.1。使用MSVC++ 12.0编译器通过各自的IDE编译.exe和.dll文件。
QGraphicsView是一个标准的Qt类。据我所知,我只需要以这种方式注册定制课程。 (我从来不需要在任何其他项目中使用内置类。) – s3rius