2011-11-04 74 views
1

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

回答

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 
} 
+0

不,没有帮助。它成功地触及lib编译并生成相同消息的liblib.a文件。 – flashnik

+0

更新了我的回复 – Adam

+1

我更喜欢的是设置(导出)包含项目目录绝对路径的环境变量。然后我将它用于包含路径和lib路径的.pro文件中: 'INCLUDEPATH + = $(PROJECT_HOME)/ include LIBS + = -L $(PROJECT_HOME)/ lib LIBS + = -lsomeLib'。这样你就不会遇到pro文件中的相对路径问题 – azf