我有一个包含多个项目的解决方案。我的项目(但不是全部)使用预编译的头文件。我决定使用protobuf,但我遇到了问题。通过protoc.exe从* .proto生成* .pb.h之后,我试图包含标题并得到错误 - 预编译的标题没有包含在* .pb.h中。
我如何解决这个问题?我有一个想法(但我根本不喜欢它) - 在protoc生成* .pb.h之后我可以运行一些脚本,它将我的预编译头包含在* .pb.h中。但我不喜欢它,因为有些项目可能不使用PCH,而PCH文件名可能不同。
我知道我可以从我的项目中删除PCH,但我也不喜欢这个想法。
答案 0 :(得分:1)
您可以逐个文件地禁用预编译的标题选项。
鉴于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重新编译。
答案 1 :(得分:1)
我通过创建一个名为proto-objects(没有PCH)的静态库并在那里包含我所有的* pb.h(cpp)文件解决了我的问题。在它之后,我将该库链接到我需要我的protobuf对象的每个项目。利润!
答案 2 :(得分:1)
不要将生成的myproto.pb.cc添加到您的项目中。而是使用
创建一个myproto.cpp#include "pch.h"
#include "myproto.pb.cc"