2012-06-03 62 views
4

我在Linux上Qt Creator的 - 使用外部庫在我自己的圖書館

我創造我自己的圖書館,這樣我可以在整個一組應用程序使用一些通用類開發Qt Creator中C中的應用++。

在我創建的庫中,我使用了另一個外部靜態庫(libSDL.a)。 我已經將我的庫配置爲靜態庫(* .a),並且它沒有問題編譯。

然後我將我的庫添加到另一個應用程序並使用了一些類。當試圖編譯我的應用程序時,我從我的庫中獲取未定義的引用來調用其他庫。

從我的理解,靜態庫假設在編譯過程中被複制。爲什麼我會得到應該複製到我的庫中的未定義的引用?

這裏是庫項目是如何在* .pro文件配置:

QT -= gui 
TARGET = FoobarTools 
TEMPLATE = lib 
CONFIG += staticlib 
CONFIG -= shared 
DEFINES += FOOBARTOOLS_LIBRARY 
INCLUDEPATH += ./include/SDL_Headers/ 
LIBS += -L./bin/ -lSDL 
SOURCES += ... 
HEADERS += ... 

這裏是我的.pro文件中使用我的圖書館如何申請*:

QT -= gui 
TARGET = FoobarApp 
CONFIG += console 
CONFIG -= app_bundle 
TEMPLATE = app 
INCLUDEPATH += ./include/ 
LIBS += -L./bin/ -lFoobarTools 
SOURCES += ... 
HEADERS += ... 

回答

-1

我想你可以在這裏找到答案:

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00104.html

,更準確地說我n這個後續:

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00106.html

我現在不能測試,但我認爲可能的原因可能是由這個恢復:

「連接器將‘拋棄’一庫,如果涉及跨越它,但它所定義的符號都不需要「

作爲急救幫助,請將-lSDL添加到第二個.pro文件。

編輯:你確定你的靜態庫(第一個.pro文件)真的使用了libSDL中的一些符號嗎?如果不是,那麼編譯器會簡單地忽略libSDL.a文件,並且不會將其包含在靜態庫中。即使你使用libSDL.a中的一些符號,只有這些函數會被複制到可執行文件中,而其他符號不會(至少,這是我認爲的)。 「靜態庫在鏈接時有特殊的規則,如果對象提供未解析的符號,靜態庫中的對象只會添加到二進制文件中。」 (見:https://stackoverflow.com/a/2649792/1284631)。然後,如果您的可執行文件(第二個.pro文件)使用libSDL中的一些未複製的符號,則會出現錯誤。引用相同的來源:「在Linux上,可以使用--whole-archive連接器選項更改該行爲:g ++ -Wl, - whole-archive some_static_lib.a -Wl, - no-whole-archive」。通過這種方式,您可以確保您的整個靜態libSDL.a文件在您的內部。

1

在應用程序的需要的.pro:

INCLUDEPATH += LibraryPath(這指向頭文件的目錄。)

DEPENDPATH += LibraryPath(這也指出了頭文件的目錄。)

LIBS += -LDebugOrReleasePath -lLibraryName(這是LIB文件名減去「LIB」開頭和「.A」結尾。)

一旦這樣做了檢查#包括您的自定義庫仍在工作。

在你不需要接觸任何靜態libary的.pro文件,可能添加「CONFIG + =釋放」。

0

無論你的圖書館以及它的使用圖書館應在應用程序鏈接。

INCLUDEPATH += ./include/SDL_Headers/ 
INCLUDEPATH += ./include/ 
LIBS += -L./bin/ -lFoobarTools 
LIBS += -L./bin/ -lSDL 
//And dont forget the Target dependencies. 
PRE_TARGETDEPS += ./libFoobarTools.a 
PRE_TARGETDEPS ./libSDL.a 

如果您想了解更多關於該庫編譯但不是應用程序檢查出this question的原因。

相關問題