我刚刚安装了Qt 4.7.4并尝试制作一个使用Qt DLL的简单Qt应用程序。我像往常一样通过ifdef在DLL中的类中添加了导出/导入,但是在编译App I时它是未解析的引用。我还设置App取决于DLL。
以下是主要文件:
Lib.pro
QT -= gui
TARGET = Lib
TEMPLATE = lib
DEFINES += LIB_LIBRARY
SOURCES += lib.cpp
HEADERS += lib.h\
Lib_global.h
symbian {
MMP_RULES += EXPORTUNFROZEN
TARGET.UID3 = 0xE10C4E25
TARGET.CAPABILITY =
TARGET.EPOCALLOWDLLDATA = 1
addFiles.sources = Lib.dll
addFiles.path = !:/sys/bin
DEPLOYMENT += addFiles
}
unix:!symbian {
maemo5 {
target.path = /opt/usr/lib
} else {
target.path = /usr/lib
}
INSTALLS += target
}
App.pro
QT += core gui
TARGET = App
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
lib.h
#ifndef LIB_H
#define LIB_H
#include "Lib_global.h"
#include <QString>
class LIBSHARED_EXPORT Lib {
public:
Lib();
~Lib();
QString Hello(QString a);
};
#endif // LIB_H
Lib_global.h
#ifndef LIB_GLOBAL_H
#define LIB_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(LIB_LIBRARY)
# define LIBSHARED_EXPORT Q_DECL_EXPORT
#else
# define LIBSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // LIB_GLOBAL_H
这段代码有什么问题?为什么没有解决参考? 在App中我只包含“../Lib/lib.h”并尝试使用该类。
答案 0 :(得分:1)
看起来缺少的是您的应用程序和动态库之间的链接。
我经常为我的桌面(linux)应用程序执行类似的操作:
INCLUDEPATH += ./include
LIBS += -L./lib -lLib
其中:
INCLUDEPATH 定义共享库.h文件所在的路径。
LIBS 定义构建库的路径。
您可以在此处找到相关文档:QMake - Declaring Other Libraries
<强>更新强>
我能够构建项目(Linux Qt v4.7.4)并使用您发布的代码链接到库。我会尽力澄清,因为我的回答可能不完全清楚。
必须将 INCLUDEPATH 和 LIBS 变量添加到App.pro文件中。 要使链接器正确查找库,必须将路径调整为您用于项目的路径:
LIBS + = -L 路径 -l <strong> LIBNAME
假设您的文件夹结构类似于以下内容:
Project
|_ Lib (your sharded library project files)
|_ App (your application project files)
您可以像这样调整变量:
INCLUDEPATH += ../Lib
LIBS += -L../Lib -lLib
请注意,根据您的平台,您可能会有不同的链接,您可以执行以下操作来涵盖Windows和Linux:
unix {
INCLUDEPATH += ../Lib
LIBS += -L../Lib -lLib
}
win32 {
INCLUDEPATH += ../Lib
LIBS += ../Lib.lib
}