2016-11-30 83 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