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!
我还观察到,它不只是函数模板,在任何功能的连接语句这是在头文件中定义失败。函数模板在头文件中定义更明显。那么为什么连接语句在动态库中的头文件中定义的函数失败时失败?
你有此行的一个问题:
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文件中。
谢谢在更改为以下代码后确实工作 class MYSHAREDLIB_EXPORT Base:public QObject public: 模板
'MYSHAREDLIB_EXPORT'对于我来说不需要内联函数。事实上,它阻止我链接最终的二进制文件('error:function'...'定义标记为dllimport') –
它可以在MSVC2015和MinGW上使用Qt 5.8。你使用的是哪个Qt版本和操作系统? –
桌面Qt 5.4.2 Windows上的MinGW 32bit –
我也只是现在用Qt 5.7测试MinGW 32位导致与我的问题中提到的结果相同 –