【发布时间】: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.dll 和sharedlib.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/
- 如果我将 .h 和 .dll/.lib 文件放在 loadlib/include 和 loadlib/libs 等子文件夹中,它会变为
INCLUDEPATH += $$PWD/include DEPENDPATH += $$PWD/include和LIBS += -L$$PWD/libs -lsharedlib,对吧? - 我需要将所有 3 个文件复制到我的 loadlib 目录吗?
-
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