如何在具有预编译头文件的项目中使用google protobuf

时间:2017-06-01 12:07:28

标签: c++ qt protocol-buffers

我有一个包含多个项目的解决方案。我的项目(但不是全部)使用预编译的头文件。我决定使用protobuf,但我遇到了问题。通过protoc.exe从* .proto生成* .pb.h之后,我试图包含标题并得到错误 - 预编译的标题没有包含在* .pb.h中。

我如何解决这个问题?我有一个想法(但我根本不喜欢它) - 在protoc生成* .pb.h之后我可以运行一些脚本,它将我的预编译头包含在* .pb.h中。但我不喜欢它,因为有些项目可能不使用PCH,而PCH文件名可能不同。

我知道我可以从我的项目中删除PCH,但我也不喜欢这个想法。

3 个答案:

答案 0 :(得分:1)

您可以逐个文件地禁用预编译的标题选项。

鉴于pch选项旨在加快编译速度,您可以为整个项目关闭它,并且不需要进一步更改。 Select enable disable

项目Choose name of header and pch file

中每个文件也可以选择头文件的名称和pch文件。

更新

微软预编译PCH系统的理念是

  • 加快编译
  • 让它易于使用

C / C ++中的头文件系统存在问题,因为它实际上是一个文本替代品。

这意味着

#include "localdefs.h"
#include <windows.h>
#include "project.h"
#include "support.h"

无关
#include <windows.h>
#include "project.h"
#include "support.h"

这是因为localdefs.h可以重新定义所有其他包含的行为。

除此之外,浏览windows.h头文件的复杂性需要花费很多时间。

PCH系统试图通过观察大多数项目都有一组包含大多数/所有CPP文件的包含文件来解决这个问题。

stdafx.h中定义此设置允许将该解析的文本结果粘贴到cpp文件中并节省大量工作。

如果项目中的大多数包含都不同,则无需使用它。

因此,如果您在许多地方包含相同的qt头文件 - 将它们添加到预编译的头文件中。添加到此文件中的常见包含越多,编译速度的提高就越好。

任何非标准cpp文件都可以通过特别禁用来排除 - 例如“生成的文件”。模板生成器不理解MSVC系统的地方。

如果所有文件都不同,那么只会获得有限的性能优势 - 因为每次编译都可能包含pch重新编译。

答案 1 :(得分:1)

我通过创建一个名为proto-objects(没有PCH)的静态库并在那里包含我所有的* pb.h(cpp)文件解决了我的问题。在它之后,我将该库链接到我需要我的protobuf对象的每个项目。利润!

enter image description here

答案 2 :(得分:1)

不要将生成的myproto.pb.cc添加到您的项目中。而是使用

创建一个myproto.cpp
#include "pch.h"
#include "myproto.pb.cc"