DLL шаблона Qt "функция помечена как dllimport" - PullRequest
0 голосов
/ 05 января 2012

У меня серьезная проблема с моей DLL в Qt.Когда я компилирую свои последние добавления (assertInt () и randomInt ()), я получаю следующую ошибку компиляции

error: определение функции 'randomInteger (const T &, const T &)' помечено как dllimport

Очевидно, я могу принудительно скомпилировать программу, заменив JECLIBRARYSHARED_EXPORT на Q_DECL_EXPORT, но тогда мне придется изменить его обратно на импорт при использовании библиотеки.Это было бы больно.

Кто-нибудь знает, почему эти две конкретные подпрограммы помечаются как DLLIMPORT вместо экспорта?Остальная часть библиотеки экспортируется как следует.Я определил JECLIBRARYSHARED в моем файле .pro.

Так 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 защитит от этого.Я попробую поэкспериментировать и опубликую любые результаты, которые я смогу получить.

Любая помощь будет оценена.Спасибо,

Джек

1 Ответ

1 голос
/ 05 января 2012

Как вы собираетесь импортировать или экспортировать функцию template?Функция шаблона не имеет кода для экспорта.Вызывающий сначала предоставляет фактическое определение для функции шаблона, затем генерируется код для этого создается фактическое определение .

Таким образом, вы не можете экспортировать

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

Когда вы используете эту функцию как foo(intValue);, вы предоставляете фактическое определение для шаблона, а затем генерируется код для void foo(int param), но нет никакого способа сгенерировать код, пока вы не узнаете, что на самом деле является typename T.

На самом деле, поскольку функция определена в заголовке, вы не должны помечать ее ни dllexport, ни dllimport

Также вы не можете dllimport функцию, которая имеет определение (не декларация ), очевидно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...