c++ - Qt模板DLL "function marked as dllimport"

标签 c++ qt templates dll

我在 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 中定义的,因此您不应将其标记为 dllexportdllimport

显然,您也不能dllimport 具有定义(不是声明)的函数。

关于c++ - Qt模板DLL "function marked as dllimport",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734187/

相关文章:

c++ - C++ 中的新功能 "synchronized" block 有什么优势?

c++ - 在 *.cpp 而不是 *.h 中定义函数时出现 undefined reference 错误

c++ - 为什么 pow(int, int) 这么慢?

c++ - 无法区分 JSON Object/Array/String

c++ - 了解从链表中删除重复项的复杂性

c++ - 显示未显示在 qt 中其他类的文本框中

qt - CMake 3.9现在可以在Visual Studio中创建“自动生成”项目吗?

css - 缩放页面 (ctr+ ctr-),折叠模板

c++ - 提取函数指针参数和返回类型

javascript - 有没有办法将变量传递给angularjs中的模板?