繁体   English   中英

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

[英]How to use google protobuf in a project with precompiled headers

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

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

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

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

鉴于 pch 选项旨在加快编译速度,您可以在整个项目中将其关闭,无需进一步更改。 选择启用禁用

头文件名称的选择,项目中每个文件也可选择pch文件选择标题和 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 重新编译。

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

在此处输入图片说明

不要将生成的 myproto.pb.cc 添加到您的项目中。 相反,创建一个 myproto.cpp

#include "pch.h"
#include "myproto.pb.cc"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM