以下情况:
我在DLL A中有一个类(Parent
),它有一个信号(这是最终的)。我在DLL B中有一个继承自A的类(Child
)。我将这两个DLL导入到我的项目中。然后我在我的项目中有一个类获取Child
类的实例,并尝试将Child
实例的信号连接到当前对象。不知何故,此连接失败。在调试模式下运行整个事情只能给我:QObject::connect: signal not found in Child
。检查dumpbin会显示信号在DLL A中但在DLL B中没有。类Parent
和类Child
都有正确的导出语句,但不知何故是{{1}的信号} class不会导出。以下是整个代码:
A.DLL:
Child
B.DLL:
class DLLA_SHAREDEXPORT ParentInterface{
public:
~ParentInterface(){}
virtual void test() = 0;
};
Q_DECLARE_INTERFACE(ParentInterface, "ParentInterface")
class DLLA_SHAREDEXPORT Parent : public QObject,
public ParentInterface{
Q_OBJECT
Q_INTERFACES(ParentInterface)
...
signals:
void test();
}
项目中的课程:
class DLLB_SHAREDEXPORT Child : public Parent{
Q_OBJECT
...
}
所以问题似乎在某个地方是DLL B中所有内容的正确导出,但我无法弄清楚如何做到这一点。任何帮助将不胜感激。
答案 0 :(得分:1)
对不起,我无法在Windows 10.0上使用MSVC2015和Qt 5.7或OS X 10.10重现此问题。请逐字尝试这个项目,看看它是否适合你。如果确实如此,那么你就会做出其他错误,需要制作一个测试用例并将其编辑成问题。
该项目可从以下网址获得:https://github.com/KubaO/stackoverflown/tree/master/questions/sigslot-dll-39149263
TEMPLATE = subdirs
SUBDIRS += lib1 lib2 main
main.depends += lib1 lib2
lib2.depends += lib1
QT = core
CONFIG += c++11
TEMPLATE = lib
HEADERS += lib1.h
win32:DEFINES += LIB1_EXPORT=__declspec(dllexport)
#ifndef LIB1_H
#define LIB1_H
#include <QObject>
#ifdef WIN32
#ifndef LIB1_EXPORT
#define LIB1_EXPORT __declspec(dllimport)
#endif
#else
#define LIB1_EXPORT
#endif
class LIB1_EXPORT Parent : public QObject {
Q_OBJECT
public:
Q_SIGNAL void test();
};
#endif
QT = core
CONFIG += c++11
TEMPLATE = lib
HEADERS += lib2.h
win32:DEFINES += LIB2_EXPORT=__declspec(dllexport)
win32:CONFIG(debug,release|debug) LIBSUBPATH=/debug
win32:CONFIG(release,release|debug) LIBSUBPATH=/release
LIBS += -L../lib1$$LIBSUBPATH -llib1
INCLUDEPATH += ..
DEPENDPATH += ..
#ifndef LIB2_H
#define LIB2_H
#include "lib1/lib1.h"
#ifdef WIN32
#ifndef LIB2_EXPORT
#define LIB2_EXPORT __declspec(dllimport)
#endif
#else
#define LIB2_EXPORT
#endif
class LIB2_EXPORT Child : public Parent {
Q_OBJECT
};
#endif
QT = core
CONFIG += c++11
TEMPLATE = app
SOURCES += main.cpp
win32:CONFIG(debug,release|debug) LIBSUBPATH=/debug
win32:CONFIG(release,release|debug) LIBSUBPATH=/release
LIBS += -L../lib1$$LIBSUBPATH -llib1 -L../lib2$$LIBSUBPATH -llib2
INCLUDEPATH += ..
DEPENDPATH += ..
#include "lib1/lib1.h"
#include "lib2/lib2.h"
int main() {
int counter = 0;
Child child;
Parent * parent = &child;
QObject::connect(parent, &Parent::test, [&]{ counter++; });
emit parent->test();
emit parent->test();
Q_ASSERT(counter == 2);
}
答案 1 :(得分:0)
所以这个问题似乎与接口的使用有关。我们现在通过将所有内容从ParentInterface移动到Parent类并删除ParentInterface来解决问题。这感觉更像是一种解决方法,而不是一种适当的解决方案。