Qt模板DLL“标记为dllimport的功能”

时间:2012-01-04 21:18:45

标签: c++ qt templates dll

我在Qt中遇到了严重的DLL问题。当我编译我最近的添加(assertInt()和randomInt())时,我得到以下编译错误

错误:函数'T randomInteger(const T&,const T&)'定义标记为dllimport

显然我可以通过用Q_DECL_EXPORT替换JECLIBRARYSHARED_EXPORT来强制程序编译,但是在使用库时我必须将其更改回导入。那将是一种痛苦。

有谁知道为什么这两个特定的子程序被标记为DLLIMPORT而不是导出?库的其余部分按原样导出。我在.pro文件中定义了JECLIBRARYSHARED。

这是QtCreator在创建DLL项目时如何生成DLL导出代码。

JecLibary_global.h

#ifndef JECLIBRARY_GLOBAL_H
#define JECLIBRARY_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(JECLIBRARY_LIBRARY)
#  define JECLIBRARYSHARED_EXPORT Q_DECL_EXPORT
#else
#  define JECLIBRARYSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // JECLIBRARY_GLOBAL_H

JecMath.h

#ifndef JECMATH_H
#define JECMATH_H

#include <QList>
#include <QTime>

#include <JecLibrary_global.h>
#include <JecUtils.h>

template<class T>
T JECLIBRARYSHARED_EXPORT randomInteger(const T& max, const T& min = 0)
{
    assertInteger(max);

    qsrand((uint)QTime::currentTime().msec());
    return qrand() % ((max + 1) - min) + min;
}

JecUtils.h

#include <typeinfo>

#include <QString>
#include <QRegExp>

#include <JecLibrary_global.h>

template<class T>
void JECLIBRARYSHARED_EXPORT assertInteger(const T& var)
{
    static_assert(sizeof(T) != sizeof(bool) ||
            sizeof(T) != sizeof(char) ||
            sizeof(T) != sizeof(short) ||
            sizeof(T) != sizeof(int) ||
            sizeof(T) != sizeof(long), "T is not an integer.");
}

这些子程序唯一不同的是它们是模板化的。我也想知道是否存在依赖问题,因为JecMath.h包含JecUtil.h所以JecLibrary_global.h被包括两次,但我认为#Ifndef会防止这种情况。我会尝试一些实验并发布我可能获得的任何结果。

任何帮助将不胜感激。谢谢,

JEC

1 个答案:

答案 0 :(得分:1)

您将如何导入或导出template功能?模板函数没有任何要导出的代码。调用者首先为模板函数提供实际定义,然后生成实际定义的代码。

所以,你无法导出

template<typename T>void foo(T param);

当您使用此函数作为foo(intValue);时,您提供了模板的实际定义,然后生成了void foo(int param)的代码,但在您知道{{1}之前,没有任何方法可以生成代码实际上。

实际上,由于函数是在标题中定义的,因此不应将其标记为typename Tdllexport

另外,你不能dllimport一个具有 defenition (不是声明)的功能。