Qt的C++:连接呼叫在动态库头失败

问题描述:

我有以下代码未能连接在头文件动态库(TestTemplateInheritance)信号但对于静态库正常工作Qt的C++:连接呼叫在动态库头失败

//TestTemplateInheritance.pro

QT  += core 
QT  -= gui 
TARGET = $$qtLibraryTarget($$TARGET) 
TEMPLATE = lib 
SOURCES += \ 
    base.cpp \ 

HEADERS += \ 
    base.h \ 

//base.h

#ifndef BASE_H 
#define BASE_H 
#include <QObject> 
#include <QDebug> 
class Q_DECL_EXPORT Base : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Base(QObject *parent = 0); 

signals: 
    void testSignal(); 
    public: 
    template <class T> 
    void callInHeader(T arg) 
    { 
     qCritical()<<"Does it connect here? in " << arg; 
     connect(this, &Base::testSignal, this, &Base::testSlot); 
    } 
    void callInDefinition(); 
public slots: 
    void testSlot() 
    { 
     qCritical() << "Slot called"; 
    } 
}; 
#endif // BASE_H 

//base.cpp

#include "base.h" 

Base::Base(QObject *parent) : QObject(parent) 
{  
} 
void Base:: callInDefinition() 
{ 
    qCritical()<<"Does it connect here?"; 
    connect(this, &Base::testSignal, this, &Base::testSlot); 
    qCritical()<<"Yes it does!"; 
} 

现在,应用程序

//TestTemplateFail.pro

QT  += core 
QT  -= gui 
TARGET = TestTemplateFail 
CONFIG += console 
CONFIG -= app_bundle 
LIBS += -L$$PWD/../release/release -lTestTemplateInheritance 
TEMPLATE = app 
SOURCES += main.cpp 

//main.cpp

#include <QCoreApplication> 
#include "../TestTemplateInheritance/base.h" 
int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QObject *obj = new QObject(); 
    Base* d = new Base(obj); 
    d->callInHeader<QString>("header"); 
    d->callInDefinition(); 
    return a.exec(); 
} 

结果:

Does it connect here? in "header" 
QObject::connect: signal not found in Base 
Does it connect here? 
Yes it does! 

如果我建立一个静态库(CONFIG + = staticlib)ins一个充满活力的图书馆。没有连接错误

结果:

Does it connect here? in "header" 
Does it connect here? 
Yes it does! 

我还观察到,它不只是函数模板,在任何功能的连接语句这是在头文件中定义失败。函数模板在头文件中定义更明显。那么为什么连接语句在动态库中的头文件中定义的函数失败时失败?

+0

它可以在MSVC2015和MinGW上使用Qt 5.8。你使用的是哪个Qt版本和操作系统? –

+0

桌面Qt 5.4.2 Windows上的MinGW 32bit –

+0

我也只是现在用Qt 5.7测试MinGW 32位导致与我的问题中提到的结果相同 –

你有此行的一个问题:

class Q_DECL_EXPORT Base : public QObject 

当头部从另外一个程序包括(相当您编译库),它应该是:

class Q_DECL_IMPORT Base : public QObject 

易于解决方案是,以取代它:

#if defined(MYLIB_LIBRARY) 
# define MYLIBSHARED_EXPORT Q_DECL_EXPORT 
#else 
# define MYLIBSHARED_EXPORT Q_DECL_IMPORT 
#endif 
class MYLIBSHARED_EXPORT Base : public QObject 

,并添加

DEFINES += MYLIB_LIBRARY 

只在您的库的.pro文件中。

+0

谢谢在更改为以下代码后确实工作 class MYSHAREDLIB_EXPORT Base:public QObject public: 模板 MYSHAREDLIB_EXPORT void callInHeader(T arg); –

+0

'MYSHAREDLIB_EXPORT'对于我来说不需要内联函数。事实上,它阻止我链接最终的二进制文件('error:function'...'定义标记为dllimport') –