如果问题真的很愚蠢,请原谅我 - 我没有找到任何相关信息。我发现的所有关于库的文章都在项目文件中提供了单个库附件语法的简单案例,但没有考虑将静态库与其他实现文件一起添加到静态库中。所以这个问题对我来说是最后的选择...
我将首先描述情况,问题将在本文末尾,所以如果你想避开BS,请向下滚动。
梗概: 我使用QT Creator 4.1(QT 5.6.2,MinGW 4.9.2 32位,qmake)在Windows 7 64位下工作。 在我的学校项目中,我做了一个简单的控制台聊天,这是使用谷歌Protobuff库(我内心无知的懒惰魔鬼每次提到该库时都会吐咒,因为我花了将近4天时间尝试编译protoc.exe并使其正常工作。 )。值得庆幸的是,我正在运行此聊天,现在是时候将Protobuff .h和.cpp文件与所有可共享代码一起移动到静态库中。而且现在这部分承诺比安装protoc.exe更让人痛苦。
我做了什么:
在MSYS中制作了libprotobuf.a。
使用protoc。 exe我创建了两个文件:messageformat.pb.cc和messageformat.pb.h
使用QT Creator的“添加新...”向导创建了一个静态库“ChatLib”。该库适用于Protobuff文件。
在“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”库添加到项目文件中,就像我将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”,找到了第一个对我在步骤4中包含的路径中的.h文件的引用,并说他找不到他,虽然该文件存在。同样的事情发生在那里包含的所有.h文件中(如果我注释掉第一个参考编译器只是抱怨下一个)。就好像路径上存在某种冲突,但我找不到。
现在我的问题是:那里我做错了什么?这种静态库“初始”是一种很好的做法,还是甚至可以做到这一点? 告诉我这样做的人并不熟悉qmake,因为他正在使用cmake,他告诉那里有链依赖。是不是qmake不具备它?如果没有,那么这个库如何构建成可编译状态?
非常感谢任何胆敢解决这个问题的人=)。 (如果我真的应得的话,还是在我头上的一些东西)
答案 0 :(得分:0)
您的可执行文件需要访问libprotobuf.a中的头文件,因为它们在ChatLib的标题中公开。如果您只能在ChatLib的源文件中包含libprotobuf.a标头,则不需要这样做。
您还需要将libprotobuf.a链接到ChatLib库旁边的最终可执行文件中。静态库基本上是一个目标文件包(例如,您在编译时获得的但不链接单个源文件,通常以&#39; .obj&#39;或&#39; .o&#39;)结束。 。当你构建一个依赖于另一个静态库的静态库时(例如,当ChatLib依赖于libprotobuf.a时),它通常不会将你链接的库中的目标文件(例如libprotobuf.a)转储到库中正在创建(例如ChatLib)。