Qt - 包含 'Utility' 函数的共享库?

Qt - Shared Library Containing 'Utility' Functions?

来自非 C++ 背景,我正在尝试使用 Qt 重写一些项目。我需要创建一个共享库来容纳常用的 'utility' 函数。我不需要 class,因为所有函数都是静态的,所以我的想法是创建一个包含所有函数的命名空间,但是,使用 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");
    }

}

除了 header 中的不幸包含之外,这在代码方面看起来还不错。

如果您将其构建为共享库并且平台使用符号隐藏,那么您需要 "export" 函数。

这通常是通过 "export macro" header 来完成的,即像这样的东西

#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

然后用于标记应该在 link 时间可见的符号

#include "utils_export.h"

namespace Utils {
    UTILS_EXPORT QString getAppName();
}

库的.pro文件需要设置触发宏导出部分的define

DEFINES += MAKE_UTILS_LIB=1

我创建了小型记事本应用程序,其中包含一些对 Qt 项目有用的实用程序 QUtils - Utils for Qt 这是它包含的一些方法列表。

//Public non-static methods. Invoke using 'g_Utils' instance.
//UI Dialogs,Information methods.
void Qt_ShowInfo(QString info_msg,QString title="INFO");
void Qt_ShowWarning(QString warning_msg,QString title="WARNING");
void Qt_ShowError(QString err_msg,QString title="ERROR");
int Qt_ShowDialog(QString dlg_msg,QString dlg_title);

//File Manipulation methods.
QString Qt_ShowOpenFileDlg(QString extension,bool log_dbg=false);
QString Qt_ShowOpenFileDlg(QString title,QString extension,QString init_path,bool log_dbg=false);
QString Qt_ShowSaveFileDlg(QString title,bool log_dbg=false);
QString Qt_ReadFile(QString file_name,bool log_dbg=false);
void Qt_WriteFile(QString file_name,QString file_data,bool log_dbg=false);