Qt — Shared Library, содержащая «служебные» функции?

Исходя из не C ++ фона, я пытаюсь переписать несколько проектов с использованием Qt. Мне нужно создать разделяемую библиотеку, в которой будут размещаться часто используемые «служебные» функции. Мне не нужен класс, так как все функции будут статическими, поэтому я подумал о том, чтобы создать пространство имен, которое будет содержать все функции, однако выполнение этого с использованием предоставленного Qt шаблона общей библиотеки не работает. Это возможно? Если да, то может кто-нибудь указать мне правильное направление?

Например, я хочу взять приведенные ниже функции Utils и поместить их в общую библиотеку, чтобы мне не приходилось копировать файлы во все проекты, где я хочу их использовать.

Utils.h

#ifndef UTILS_H
#define UTILS_H

#include <QtCore>
#include <QString>
#include <QDateTime>
#include <QFileInfo>

namespace Utils {
QString getAppName();
bool stringToBool(const QString &str);
QString getFileTimeStamp();
QString getPacketTime();
QString getTodayStamp();
}

#endif // UTILS_H

Utils.cpp

#include <Helpers/utils.h>

namespace Utils {

QString getAppName()
{
return QFileInfo(QCoreApplication::applicationFilePath()).baseName();
}

bool stringToBool(const QString &str)
{
return str.contains("1");
}

QString getFileTimeStamp()
{
return QDateTime::currentDateTime().toString("ddhhmmsszzz");
}

QString getPacketTime()
{
return QDateTime::currentDateTime().toString("hh:mm:ss");
}

QString getTodayStamp()
{
return QDateTime::currentDateTime().toString("MMddyy");
}

}

1

Решение

Помимо неудачного включения в шапку, это выглядит неплохо для кода.

Если вы строите это как разделяемую библиотеку, а платформа использует скрытие символов, вам нужно «экспортировать» функции.

Обычно это делается с помощью заголовка «export macro», т.е.

#include <qglobal.h>

#ifndef UTILS_EXPORT
# if defined(MAKE_UTILS_LIB)
/* We are building this library */
#  define UTILS_EXPORT Q_DECL_EXPORT
# else
/* We are using this library */
#  define UTILS_EXPORT Q_DECL_IMPORT
# endif
#endif

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

#include "utils_export.h"
namespace Utils {
UTILS_EXPORT QString getAppName();
}

Библиотека .pro файл должен установить define который запускает экспортную часть макроса

DEFINES += MAKE_UTILS_LIB=1
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]