【问题标题】:Linking Qt DLL to Qt App - unresolved references将 Qt DLL 链接到 Qt App - 未解决的引用
【发布时间】:2011-11-04 22:46:44
【问题描述】:

我刚刚安装了 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
}

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

【问题讨论】:

    标签: qt dll qt4 dllimport unresolved-external


    【解决方案1】:

    看起来缺少的是您的应用程序和动态库之间的链接。

    我通常为我的桌面 (linux) 应用程序做这样的事情:

    INCLUDEPATH +=  ./include
    LIBS += -L./lib -lLib
    

    地点:

    INCLUDEPATH 定义共享库 .h 文件所在的路径。

    LIBS 定义了构建库所在的路径。

    你可以在这里找到相关文档:QMake - Declaring Other Libraries

    更新:

    我能够构建项目(Linux Qt v4.7.4)并使用您发布的代码链接到库。我会尽量澄清,因为我的回答可能并不完全清楚。

    INCLUDEPATHLIBS 变量必须添加到 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
    }
    

    【讨论】:

    • 不,这没有帮助。它成功地触及了 liblib.a 文件,lib 编译到该文件并生成相同的消息。
    • 我更喜欢设置(导出)一个环境变量,其中包含项目目录的绝对路径。然后我在 .pro 文件中使用它作为包含路径和库路径:INCLUDEPATH += $(PROJECT_HOME)/include LIBS += -L$(PROJECT_HOME)/lib LIBS += -lsomeLib。这样你就不会遇到专业文件中的相对路径问题
    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2020-05-26
    相关资源
    最近更新 更多