将Qt DLL链接到Qt App - 未解决的引用
问题描述:
我刚刚安装了Qt 4.7.4并试图制作一个使用Qt DLL的简单Qt应用程序。我像往常一样通过ifdef在DLL中的类中添加了导出/导入,但是在编译App时,我琢磨了未解析的引用。我也设置该应用程序依赖于DLL。将Qt DLL链接到Qt App - 未解决的引用
以下是主要文件:
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
有什么不对的代码?为什么它是未解决的参考? 在应用程序中,我只包含“../Lib/lib.h”并尝试使用该类。
答
看起来缺少的是应用程序和动态库之间的链接。
我平时做这样的事情对我的桌面(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 PATH -l 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
}
不,没有帮助。它成功地触及lib编译并生成相同消息的liblib.a文件。 – flashnik
更新了我的回复 – Adam
我更喜欢的是设置(导出)包含项目目录绝对路径的环境变量。然后我将它用于包含路径和lib路径的.pro文件中: 'INCLUDEPATH + = $(PROJECT_HOME)/ include LIBS + = -L $(PROJECT_HOME)/ lib LIBS + = -lsomeLib'。这样你就不会遇到pro文件中的相对路径问题 – azf