Исходя из не 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");
}
}
Помимо неудачного включения в шапку, это выглядит неплохо для кода.
Если вы строите это как разделяемую библиотеку, а платформа использует скрытие символов, вам нужно «экспортировать» функции.
Обычно это делается с помощью заголовка «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
Других решений пока нет …