将Qt DLL链接到Qt App - 未解析的引用

时间:2011-11-04 22:46:44

标签: qt dll qt4 dllimport unresolved-external

我刚刚安装了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”并尝试使用该类。

1 个答案:

答案 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
}