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