如何在预编译 headers 的项目中使用 google protobuf
How to use google protobuf in a project with precompiled headers
我有一个包含多个项目的解决方案。我的项目(但不是全部)使用预编译的 headers。我决定使用 protobuf,但遇到了一个问题。在通过 protoc.exe 从 *.proto 生成 *.pb.h 之后,我试图包含 header 并得到错误 - 预编译的 header 未包含在 *.pb.h。
我该如何解决这个问题?我有一个想法(但我一点也不喜欢)——在 protoc 生成 *.pb.h 之后,我可以 运行 一些脚本,它将我预编译的 header 包含到 * .pb.h。但我不喜欢它,因为有些项目可能不使用 PCH,PCH 文件名可能不同。
我知道我可以从我的项目中删除 PCH,但我也不喜欢这个想法。
您可以逐个文件禁用预编译头选项。
考虑到pch选项是为了加快编译速度,你可以为整个项目关闭它,不需要进一步的改变。
头文件名称的选择,以及项目中每个文件的 pch 文件也是可选的
更新
Microsoft 的预编译 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 系统试图通过观察大多数项目都有一组固定的包含文件来解决这个问题,这些文件包含在 most/all 个 CPP 文件中。
在 stdafx.h
中定义此集合允许将该解析的文本结果粘贴到 cpp 文件中并节省大量工作。
如果项目中的大部分include都不一样,那就没必要用了
因此,如果您在很多地方包含相同的 qt 头文件,请将它们添加到预编译的头文件中。这个文件中添加的common include越多,编译速度的提升就越好。
任何非标准的 cpp 文件都可以通过特别禁用来排除 - 例如 "generated files"。模板生成器不理解MSVC系统的地方。
如果所有文件都不同,那么只会获得有限的性能优势 - 因为每次编译可能还包括 pch 重新编译。
我通过创建一个名为 proto-objects(没有 PCH)的静态库并在其中包含我所有的 *pb.h(cpp) 文件来解决我的问题。在它之后,我 link 那个库到每个我需要我的 protobuf 对象的项目。盈利!
不要将生成的 myproto.pb.cc 添加到您的项目中。相反,用
创建一个 myproto.cpp
#include "pch.h"
#include "myproto.pb.cc"
我有一个包含多个项目的解决方案。我的项目(但不是全部)使用预编译的 headers。我决定使用 protobuf,但遇到了一个问题。在通过 protoc.exe 从 *.proto 生成 *.pb.h 之后,我试图包含 header 并得到错误 - 预编译的 header 未包含在 *.pb.h。
我该如何解决这个问题?我有一个想法(但我一点也不喜欢)——在 protoc 生成 *.pb.h 之后,我可以 运行 一些脚本,它将我预编译的 header 包含到 * .pb.h。但我不喜欢它,因为有些项目可能不使用 PCH,PCH 文件名可能不同。
我知道我可以从我的项目中删除 PCH,但我也不喜欢这个想法。
您可以逐个文件禁用预编译头选项。
考虑到pch选项是为了加快编译速度,你可以为整个项目关闭它,不需要进一步的改变。
头文件名称的选择,以及项目中每个文件的 pch 文件也是可选的
更新
Microsoft 的预编译 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 系统试图通过观察大多数项目都有一组固定的包含文件来解决这个问题,这些文件包含在 most/all 个 CPP 文件中。
在 stdafx.h
中定义此集合允许将该解析的文本结果粘贴到 cpp 文件中并节省大量工作。
如果项目中的大部分include都不一样,那就没必要用了
因此,如果您在很多地方包含相同的 qt 头文件,请将它们添加到预编译的头文件中。这个文件中添加的common include越多,编译速度的提升就越好。
任何非标准的 cpp 文件都可以通过特别禁用来排除 - 例如 "generated files"。模板生成器不理解MSVC系统的地方。
如果所有文件都不同,那么只会获得有限的性能优势 - 因为每次编译可能还包括 pch 重新编译。
我通过创建一个名为 proto-objects(没有 PCH)的静态库并在其中包含我所有的 *pb.h(cpp) 文件来解决我的问题。在它之后,我 link 那个库到每个我需要我的 protobuf 对象的项目。盈利!
不要将生成的 myproto.pb.cc 添加到您的项目中。相反,用
创建一个 myproto.cpp#include "pch.h"
#include "myproto.pb.cc"