2017-07-14 45 views
1

有幾個問題似乎是相似的,但沒有什麼能真正幫助我。我想在一個項目中創建一個靜態庫並在同一個項目中使用它,但會發生鏈接錯誤。窗口-Qt創建並使用自制的靜態庫

一個很好的例子,很好地滿足了我的條件是附加到Qt票務QTBUG-45706 https://bugreports.qt.io/browse/QTBUG-45706。在一個簡單的解釋中,我們有一個應該使用一些自制庫的應用程序。只需修改幾件事情即可查看我的問題。

應用程序 - > main.cpp中

#include <QCoreApplication> 
#include <lib.h> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    Lib l1; 

    return a.exec(); 
} 

lib.pro

CONFIG += staticlib 

如果你現在編譯項目,你會看到下面的錯誤

main.obj:-1: error: LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl Lib2::Lib2(void)" ([email protected]@[email protected]) referenced in function main 

使用Qt創建者4.0.3基於Qt 5.6.1,qmake with mscv2013

需要什麼才能使其發揮作用?

澄清:

這個項目的結構如下:

subdirs_test.pro (subdir project) 
\- app (app project, includes lib and lib2) 
\-- app.pro 
\-- main.cpp 
\- lib (static library) 
\-- lib.pro 
\-- lib.h 
\-- lib_global.h 
\-- lib.cpp 
\- lib2 (static library) 
\-- lib2.pro 
\-- lib2.h 
\-- lib2_global.h 
\-- lib2.cpp 

的 '應用' 項目應當使用lib和LIB2的類,它是靜態庫。

正如所建議的那樣,使用「添加庫...」不會改變一件事情。在我的情況下,這個代碼將被生成。

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../lib/release/ -llib 
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../lib/debug/ -llib 
else:unix: LIBS += -L$$OUT_PWD/../lib/ -llib 

INCLUDEPATH += $$PWD/../lib 
DEPENDPATH += $$PWD/../lib 

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/release/liblib.a 
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/debug/liblib.a 
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/release/lib.lib 
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../lib/debug/lib.lib 
else:unix: PRE_TARGETDEPS += $$OUT_PWD/../lib/liblib.a 
+1

目前還不清楚是什麼你正在嘗試做的。您必須設置至少2個.pro文件。一個用於lib和一個用於應用程序。在應用程序中,將庫輸出路徑添加到「INCLUDES」和「LIBS」變量中。 通常你也有第三個subdir項目,把所有的東西綁在一起 – IlBeldus

+1

[不要使用Q_DECL_IMPORT宏和靜態庫](https://forum.qt.io/topic/25328/static-library/8),宏是僅用於共享Windows庫。這是來自我的一位同事的重要說明。宏通常隱藏在其他全局頭文件中。 – sandkasten

回答

1

你可以使用QtCreators Subd irs項目。以下詳細介紹如何通過QtCreator實現這一目標。

  • New Project嚮導菜單中選擇Subdirs Project

Subdirs Project

  • 通過點擊創建子目錄項目右 鼠標按鈕並選擇New Subproject...添加Subrojects。

New Subproject

  • 通過下列嚮導,你應該有一個GUI或控制檯子項目和 庫子項目。然後點擊您想要使用鼠標右鍵鏈接 庫子項目的子項目並選擇Add Library...

Add Library

  • 選擇Internal library在對話框中,你會被提示選擇 要添加庫。

Internal library

  • 確保您的圖書館子項目之前GUI /控制檯 子項目包括作爲子目錄項目將無法建立。

    模板=子目錄

    SUBDIRS + = \ LibProject \ CoreProject

+0

感謝您的詳細描述,這非常有幫助!不幸的是,這是行不通的,找不到依靠... 但是,在添加'CoreProject.depends = LibProject'後,它的工作。 intresstig問題是,爲什麼它不在我自己的項目中工作?我會仔細檢查一切,看看能否找到任何區別。 – sandkasten

+0

@sandkasten你做了最後一步改變'SUBDIRS'包括訂單。由於QtCreator生成預先目標依賴關係'PRE_TARGETDEPS + = $$ OUT_PWD /../ LibProject/debug/LibProject.lib'並且不符合它們,您的構建將失敗。 –

+0

是的,我改變了'SUBDIRS'包括順序,但是如果我刪除了依賴,構建失敗。但我認爲這是我的主要問題,由於某些原因,構建順序不正確,lib將不會被構建並且無法鏈接。但'PRE_TARGETDEPS'在那裏(在CoreProject中) – sandkasten

1

你能嘗試做下面的步驟:

  1. 項目
  2. 右按鈕添加庫
  3. 選擇類型(外部或其他)
  4. 設置標誌靜態,這樣picture
+0

已經嘗試過這個,不會改變一件事情。生成一堆額外的代碼,但鏈接器錯誤仍然存​​在。如果這樣的話,我可以添加生成的代碼。 – sandkasten

+0

@sandkasten顯示此代碼:) – iMashine

+0

更新我的問題的結果,因爲它的評論時間太長 – sandkasten