从不同的dll继承时,信号未正确导出

时间:2016-08-25 15:31:07

标签: c++ qt dll

以下情况: 我在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中所有内容的正确导出,但我无法弄清楚如何做到这一点。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

对不起,我无法在Windows 10.0上使用MSVC2015和Qt 5.7或OS X 10.10重现此问题。请逐字尝试这个项目,看看它是否适合你。如果确实如此,那么你就会做出其他错误,需要制作一个测试用例并将其编辑成问题。

该项目可从以下网址获得:https://github.com/KubaO/stackoverflown/tree/master/questions/sigslot-dll-39149263

sigslot-dll-39149263.pro

TEMPLATE = subdirs
SUBDIRS += lib1 lib2 main
main.depends += lib1 lib2
lib2.depends += lib1

LIB1 / lib1.pro

QT = core
CONFIG += c++11
TEMPLATE = lib
HEADERS += lib1.h
win32:DEFINES += LIB1_EXPORT=__declspec(dllexport)

LIB1 / lib1.h

#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

LIB2 / lib2.pro

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 += ..

LIB2 / lib2.h

#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

主/ main.pro

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 += ..

主/ main.cpp中

#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来解决问题。这感觉更像是一种解决方法,而不是一种适当的解决方案。