使用qt创建和使用共享库

时间:2016-01-25 11:48:40

标签: qt shared-libraries

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

在我的项目中,我需要创建一个dll,它从外部库调用函数(有.h,.lib,.dll可供使用)。为了理解如何从库中导出/导入函数,我尝试用一​​个函数创建一个简单的库,并在另一个程序中首先使用它。 阅读完不同的教程后,我设法创建了库。在Qt Creator,New Project-> Library(C ++ Library) - > Type(共享库)名称: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文件,我认为是因为我使用的是提供.lib文件的microsoft vc编译器代替)。

现在创建第二个我想要使用该库的程序: 新项目 - &gt; Qt控制台应用程序 - &gt;名称(loadlib) - &gt;完成,然后我将sharedlib.lib, sharedlib.h, sharedlib.dll复制到loadlib目录中。 (我需要它们吗?我应该把它们放在哪里?) 根据教程,右键单击项目 - > gt; add library-&gt; external library-&gt;选择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();
    }
    

    我如何在这里实际使用添加功能?

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

2 个答案:

答案 0 :(得分:5)

到目前为止,您所做的一切都是正确的。现在只需在main.cpp或任何文件中包含库头文件sharedlib.h,然后在那里使用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与可执行文件一起打包在同一目录中。

答案 1 :(得分: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.
}

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