2016-11-30 123 views
0

請原諒,如果這個問題真的很愚蠢 - 我沒有設法找到任何東西。我發現了所有關於庫的文章,其中介紹了項目文件中單個庫附件語法的簡單情況,並且都沒有考慮將靜態庫與其他實現文件一起添加到靜態庫中。所以這裏的這個問題對我來說是最後的...靜態庫中的靜態庫(Protobuff):「沒有這樣的文件或目錄」

我將首先描述情況,問題將在本文末尾,所以如果你想避免BS請向下滾動。

簡介: 我使用QT Creator 4.1(QT 5.6.2,MinGW 4.9.2 32位,qmake)在Windows 7 64bit上工作。 作爲我的學校項目,我做了一個簡單的控制檯聊天,它使用Google Protobuff庫(我內心的一個無知懶惰的惡魔每次提到該庫時都會吐出詛咒,因爲我花了將近4天的時間試圖編譯protoc.exe並使其工作)。幸運的是,我得到了這個聊天,時間到了將Protobuff .h和.cpp文件與所有可共享代碼一起移動到一個靜態庫中。現在,那部分比安裝protoc.exe更有希望。

我做了什麼:

  1. 在MSYS做出libprotobuf.a。

  2. 使用protoc。 exe我創建了兩個文件:messageformat.pb.cc和messageformat.pb.h

  3. 使用QT Creator的「添加新...」嚮導創建一個靜態庫「ChatLib」。該庫是用於Protobuff文件的。

  4. 在「ChatLib」我使用的標準Qt Creator中的「添加庫」嚮導,並刪除了一些產生線(我確信這種缺失沒有影響後),以便有

只有以下行左:

QT  -= gui 
TARGET = ChatLib 
TEMPLATE = lib 
CONFIG += staticlib 

SOURCES += \ 
    messageformat.pb.cc 

HEADERS += \ 
    messageformat.pb.h 

INCLUDEPATH += "F:/Files/protobuf/src" //that folder holds .h files used in messageformat.pb.h and messageformat.pb.cc 
LIBS += -L$$PWD/../../../../../Files/protobuf/src/ -lprotobuf 
PRE_TARGETDEPS += $$PWD/../../../../../Files/protobuf/src/libprotobuf.a 
  • 在我的主要項目添加此「ChatLib」庫到項目文件I加入的Protobuf庫的「ChatLib」庫中的相同的方式:

    QT + =核心 QT - = GUI

    CONFIG += c++11 
    
    TARGET = GooglePain 
    CONFIG += console 
    CONFIG -= app_bundle 
    
    TEMPLATE = app 
    
    SOURCES += main.cpp 
    
    //the folder below holds "ChatLib/messageformat.pb.h" and "ChatLib/messageformat.pb.cc". 
    //The former ("ChatLib/messageformat.pb.h") is included into main.cpp 
    
    INCLUDEPATH += "F:/Programming/Qt/Projects" 
    LIBS += -L$$PWD/../build-ChatLib-Desktop_Qt_5_6_2_MinGW_32bit-Debug/release/ -lChatLib 
    PRE_TARGETDEPS += $$PWD/../build-ChatLib-Desktop_Qt_5_6_2_MinGW_32bit-Debug/debug/libChatLib.a 
    
  • 在我的main.cpp我列入 「ChatLib/messageformat.pb.h」。

  • 我穿過我的原住民,說一個祈禱,敲木頭,站在一條腿上,在跳紙尿褲和唱「衝浪鳥」一分鐘後打了一個鼓,並開始了該計劃。
  • 收到以下錯誤:
  • F:\Programming\Qt\Projects\ChatLib\messageformat.pb.h:9: error: google/protobuf/stubs/common.h: No such file or directory 
        \#include <google/protobuf/stubs/common.h> 
    

    發生了什麼事是,編譯看着 「ChatLib/messageformat.pb.h」,找到的第一個參考的.h位於文件我在步驟4中包含的路徑,並表示他不能找到他,儘管該文件存在。同樣的事情發生在所有。h文件包含在那裏(如果我註釋掉第一個參考編譯器只是抱怨下一個)。就好像在路上有某種衝突,但我找不到一個。

    現在我的問題是:我在那裏做錯了什麼?這種靜態圖書館「初始」是一種很好的做法,還是甚至有可能做到這一點? 那位叫我做這件事的人對qmake不熟悉,因爲他在使用cmake,他告訴我那裏支持鏈依賴。難道qmake不能勝任嗎?如果沒有,那麼這個圖書館怎麼會被構建成可編譯的狀態呢?

    非常感謝任何人敢於澄清這個問題=)。 (或者如果我真的值得擁有它,我的頭上會有一些東西)

    +0

    您需要爲項目設置系統包含路徑,以便生成的文件可以找到協議緩衝區庫標頭。 –

    回答

    0

    您的可執行文件需要訪問libprotobuf.a中的頭文件,因爲它們顯示在ChatLib的頭文件中。如果您只能在ChatLib的源文件中包含libprotobuf.a頭文件,則不需要執行此操作。

    您還需要將libprotobuf.a鏈接到您的最終可執行文件以及ChatLib庫中。靜態庫基本上是一個目標文件包(例如,當你編譯但是不鏈接單個源文件,通常以'.obj'或'.o'結尾)。當你建立一個依賴於另一個靜態庫的靜態庫(例如ChatLib依賴於libprotobuf.a)時,它通常不會將你正在鏈接的庫(例如libprotobuf.a)中的目標文件轉儲到正在創建的庫中(如ChatLib)。

    +0

    那麼包括庫鏈的每個元素到主exe的項目文件都已經工作了,所以非常感謝你=)。 雖然在這種情況下,似乎根本沒有任何一點建立圖書館連鎖。一個可以並行包含它們。 – SpookySpoon

    +0

    是的,它可能在你想在多個項目中使用libprotobuf.a(但不是ChatLib)時很有用。但是,在我的經驗中,擁有一連串的靜態庫本身並無用處。 – DAG