1

我刚刚安装了 Qt 4.7.4 并尝试制作一个使用 Qt DLL 的简单 Qt 应用程序。我像往常一样通过 ifdef 在 DLL 中的一个类中添加了导出/导入,但是在编译 App 时,我发现了未解析的引用。我还设置了 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
}

应用程序.pro

QT       += core gui

TARGET = App
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

库文件

#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”并尝试使用该类。

4

1 回答 1

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 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
}
于 2011-11-04T22:59:56.353 回答