2011-11-04 73 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