【问题标题】:create and use shared library with qt使用 qt 创建和使用共享库
【发布时间】:2016-01-25 11:48:39
【问题描述】:

我是共享库的新手,所以我对如何创建/使用共享库有疑问,我正在将 Qt Creator 与 qt 5.4.2 与 Microsoft Visual C++ 11.0 编译器一起使用。

在我的项目中,我需要创建一个从外部库调用函数的 dll(有 .h、.lib、.dll 可供使用)。为了了解从库中导出/导入函数的工作原理,我尝试创建一个带有一个函数的简单库,并首先在另一个程序中使用它。 在阅读了不同的教程之后,我设法创建了这个库。在Qt Creator中,New Project->Library(C++ Library)->Type(shared library)Name:sharedlib->Modules(QtCore)->Finish。

sharedlib.h:

#ifndef SHAREDLIB_H
#define SHAREDLIB_H

#include <QtCore/qglobal.h>

#if defined(SHAREDLIB_LIBRARY)
#  define SHAREDLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define SHAREDLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

extern "C" SHAREDLIBSHARED_EXPORT int add(int a, int b);

#endif // SHAREDLIB_H

sharedlib.cpp:

#include "sharedlib.h"
#include <stdio.h>

extern "C" SHAREDLIBSHARED_EXPORT int add(int a, int b)
{
    return a + b;
}

只添加了一个简单的函数来添加2个数字。

构建后,我得到了sharedlib.dllsharedlib.lib 以及其他一些文件(在某些教程中没有.a 文件,我认为这是因为我使用的是Microsoft vc 编译器,它提供了.lib 文件)。

现在创建第二个程序,我想在其中使用该库: New Project->Qt Console Application->Name(loadlib)->Finish,然后我把sharedlib.lib, sharedlib.h, sharedlib.dll复制到loadlib目录下。 (我都需要它们吗?我应该把它们放在哪里?) 按照教程,在工程上右击->添加库->外部库->选择loadlib目录下的.lib文件,取消Platform下Linux和Mac的勾选,选择Dynamic Linkage。 这是我的 loadlib.pro:

QT       += core
QT       -= gui

TARGET = loadlib
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app
SOURCES += main.cpp

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/ -lsharedlib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ -lsharedlib

INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/
  1. 如果我将 .h 和 .dll/.lib 文件放在 loadlib/include 和 loadlib/libs 等子文件夹中,它会变为 INCLUDEPATH += $$PWD/include DEPENDPATH += $$PWD/includeLIBS += -L$$PWD/libs -lsharedlib,对吧?
  2. 我需要将所有 3 个文件复制到我的 loadlib 目录吗?
  3. main.cpp:

    #include <QCoreApplication>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        // simple Debug output to add 7 and 3
    
        return a.exec();
    }
    

    我如何在这里实际使用 add 函数?

编辑:我改变了一些东西,摆脱了sharedlib_global.h并将内容粘贴到sharedlib.h中,并且摆脱了类,我可以直接调用函数而不将其包装到上课?

【问题讨论】:

  • 我觉得每一步都是对的。如果在main.cpp 中包含文件#include "sharedlib.h",程序是否编译?
  • 其实你能编译没有任何错误吗?您在 SharedLib 类中声明了 add 函数,但定义在类之外。
  • @ramtheconqueror:我也意识到,因为它应该保持简单,所以我摆脱了这个类。我的问题仍然是,我真的需要在我的 loadlib 目录中复制所有 3 个文件(dll/lib/h)以使其能够编译吗?

标签: qt shared-libraries


【解决方案1】:

到目前为止,您所做的一切都是正确的。现在只需将库头文件 sharedlib.h 包含在您的 main.cpp 或任何文件中,然后您就可以在那里使用 add() 函数。

#include <QCoreApplication>
#include <QDebug>
#include "sharedlib.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // simple Debug output to add 7 and 3

    SharedLib lib;
    int a = 5, b = 6;
    int sum = lib.add (a, b);

    return a.exec();
}

部署时需要将sharedlib.dll与可执行文件打包在同一目录下。

【讨论】:

  • 当我尝试编译时,它说找不到sharedlib_global.h,它包含在原始sharedlib.h中,所以我必须复制这个文件吗? (如果我必须复制每个头文件,对我来说似乎有点复杂?)
  • 是的。您需要将 sharedlib.h、sharedlib_global.h、sharedlib.lib 和 sharedlib.dll 全部包含在您的新项目中。
【解决方案2】:

试试这个(main.cpp):

#include "sharedlib.h"

#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // simple Debug output to add 7 and 3
    SharedLib sLib;
    qDebug() << sLib.add(7, 3); // should print 10

    return 0;   // just exit

//    return a.exec();  // you need to kill / force stop your app if you do ths.
}

如果您可以编译上述内容,那么您的库正在按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多