我在 Qt 中遇到了我的 DLL 的严重问题。当我编译我最近添加的内容(assertInt() 和 randomInt())时,出现以下编译错误
错误:函数 'T randomInteger(const T&, const T&)' 定义被标记为 dllimport
显然,我可以通过将 JECLIBRARYSHARED_EXPORT 替换为 Q_DECL_EXPORT 来强制程序编译,但是在使用该库时我必须将其改回导入。那会很痛苦。
有谁知道为什么这两个特定的子例程被标记为 DLLIMPORT 而不是导出?库的其余部分按应有的方式导出。我在我的 .pro 文件中定义了 JECLIBRARYSHARED。
这是我创建DLL项目时QtCreator如何生成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 可以防止这种情况。我会尝试一些实验并发布我可能得到的任何结果。
任何帮助将不胜感激。谢谢,
杰斯
最佳答案
你打算如何导入或导出模板
函数?模板函数没有任何代码可以导出。调用者首先为模板函数提供实际定义,然后生成该实际定义的代码。
所以,你不能导出
template<typename T>void foo(T param);
当您将此函数用作 foo(intValue);
时,您为模板提供了实际定义,然后生成了 void foo(int param)
的代码,但是在您真正知道什么是 typename T
之前,没有任何方法可以生成代码。
实际上,由于函数是在 header 中定义的,因此您不应将其标记为 dllexport
或 dllimport
显然,您也不能dllimport
具有定义(不是声明)的函数。
关于c++ - Qt模板DLL "function marked as dllimport",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734187/