[英]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 系统背后的想法是
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 重新编译。
不要将生成的 myproto.pb.cc 添加到您的项目中。 相反,创建一个 myproto.cpp
#include "pch.h"
#include "myproto.pb.cc"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.