【问题标题】:Qt - Shared Library Containing 'Utility' Functions?Qt - 包含“实用程序”功能的共享库?
【发布时间】:2017-02-24 08:02:00
【问题描述】:

来自非 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");
    }

}

【问题讨论】:

  • 不清楚为什么使用Qt? Qt 的哪一部分将在该库中使用?这些来自动态库的函数实现了哪些功能?
  • 因为 Qt 是我用来重写应用程序的框架,并且我正在尝试使用 Qt Creator IDE 中的共享库向导。
  • 我看到您已在问题中添加了代码。非常简单。 1. 会有对Qt本身的依赖。 2. 如果它不会被多个应用程序使用,我什至不会尝试使用 Qt 创建动态库。 3. 如果它会被许多独立的应用程序使用但使用相同的Qt版本,那么有理由做动态库,它应该足够大和复杂来满足所有工作。如果它只被一个应用程序使用,那么你不需要动态库。您的维基:wiki.qt.io/…
  • 当你说“不工作”时,请更具体一点。你期待什么,实际发生了什么? :)

标签: c++ qt utilities


【解决方案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);

【讨论】:

    【解决方案2】:

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

    如果您将其构建为共享库并且平台使用符号隐藏,那么您需要“导出”这些函数。

    这通常是通过有一个“导出宏”标题来完成的,即类似这样的东西

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多