在 Visual Studio 中的项目之间共享预编译头

2024-04-12

我有一个包含许多 Visual C++ 项目的解决方案,所有项目都使用 PCH,但有些项目打开了特定的编译器开关以满足项目特定的需求。

这些项目中的大多数在各自的 stdafx.h 中共享相同的标头集(STL、boost 等)。我想知道是否可以在项目之间共享 PCH,这样我就可以拥有一个解决方案中的大多数项目都可以使用的通用 PCH,而不是编译每个项目的每个 PCH。

似乎可以在项目设置中将 PCH 的位置指定为共享位置,因此我预感这可行。我还假设使用共享 PCH 的所有项目中的所有源文件都必须具有相同的编译器设置,否则编译器会抱怨 PCH 与正在编译的源文件之间不一致。

有人试过这个吗?有效吗?

一个相关的问题:这样的分片 PCH 是否应该过度包容,或者会影响整体构建时间?例如,共享 PCH 可以包含许多广泛使用的 STL 标头,但某些项目可能只需要<string> and <vector>。当优化器必须丢弃 PCH 拖入项目中的所有未使用的内容时,使用共享 PCH 节省的时间是否必须在构建过程的稍后时间点得到补偿?


是的,这是可能的,我可以向您保证,节省的时间非常可观。当你编译你的PCH时,你必须复制.pdb and .idb来自正在创建 PCH 文件的项目的文件。就我而言,我有一个简单的两个文件项目,用于创建 PCH 文件。标头将是您的 PCH 标头,并且源将被告知在项目设置下创建 PCH - 这与您在任何项目中通常执行的操作类似。正如您所提到的,每个配置都必须具有相同的编译设置,否则会出现差异并且编译器会抱怨。

每次重建或每次重新编译 PCH 时复制上述文件将会很痛苦,因此我们将自动化它。要自动复制,请执行预构建事件,将上述文件复制到适当的目录。例如,如果您正在编译Debug and Release构建您的 PCH,从以下位置复制文件Debug您的 PCH 项目转移到您的依赖项目的Debug。所以复制命令看起来像这样

复制 PchPath\Debug*.pdb Debug\ /-Y

请注意/-Y在最后。第一次构建后,每个后续构建都会增量编译,因此如果再次替换文件,Visual Studio 将抱怨符号损坏。如果它们确实损坏,您始终可以执行重建,这将再次复制文件(这次不会跳过它们,因为它们不再存在 - 清理会删除文件)。

我希望这有帮助。我花了相当长的时间才能够做到这一点,但这是值得的。我有几个项目依赖于一个大框架,并且 PCH 只需要编译一次。现在,所有依赖项目的编译速度都非常快。

编辑:我和其他几个人一起在 VS2010 下测试了这个 和VS2012,它看起来确实工作正常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Visual Studio 中的项目之间共享预编译头 的相关文章

  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • npm 安装后如何引用 Google Material-Design-Icons?

    所以做完之后npm install material design icons 我如何在我的React应用 所包括的方法here https google github io material design icons icon font
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • 如何通过 UIAutomation 处理“_APPNAME_想使用您当前的位置”警报

    好吧 这让我抓狂 我正在运行一个小型 CI 构建系统 我正在使用 UIAutomation 对我的应用程序进行 UI 测试 由于应用程序使用 CoreLocation 因此第一次启动应用程序时 我会收到一条小警报 要求我确认是否希望跟踪我的
  • Swig (Node.js) 中的 JSON.parse() ?

    当我陷入困境时 我试图从 Jade 切换到 Swig 被 Swig 的疯狂性能所吸引 作为我的 Express 模板引擎 我将一系列序列化 JSON 从 Express 发送到 Swig 并使用此循环检索 Swig 中的数据这里 ul if
  • node.js fs.writeFile 未完全覆盖文件

    我有一个长度为 X 的文件 它正在被长度为 X Y 的字符串覆盖 问题是 该文件仍然保留 X Y 过去的信息 因此它与第一个较长的文件一样长 所以这是我的测试输出 它让我适合 文件开头为 sOption1 String nOption2 2
  • SQL 错误:ORA-00913:值太多

    两个表在表名 列名 数据类型和大小方面相同 这些表位于不同的数据库中 但我习惯于 当前登录 hr 用户 insert into abc employees select from employees where employee id 10
  • Stripe 结账模式的事件或方法

    有什么方法可以在 Stripe Checkout 模式关闭时触发事件吗 Stripe 的模式关闭和响应传递之间存在大约 0 5 1 秒的延迟 那时 用户可能会点击离开页面等 为了解决这个问题 我们可以执行一些操作 例如禁用所有链接或在页面上
  • 如何在现有 Windows 应用程序中获得 ATL 支持

    我正在 Visual Studio 2012 中使用 Qt 5 3 1 构建一个应用程序 我还想使用一个硬件库 这需要我向项目添加一个简单的 ATL 对象 这可以通过使用 Visual Studio 向导来完成 该向导抱怨我的项目既不是 M
  • 如何确定函数特化的主要模板?

    函数模板专业化的主要模板通常是非常直观的 但是 我正在寻找正式的规则来理解更令人惊讶的情况 例如 template
  • com.google.gwt.user.client.rpc.InknownRemoteServiceException

    我的 GWT 应用程序有问题 我部署在 Jetty 服务器上并运行 但是当我执行服务器调用 GWT 服务器包上的类 时 服务器返回错误消息 消息是 7 0 6 http localhost zbapp zb app A31E1254E17F
  • 抑制 make clean 中的消息(Makefile 无提示删除)

    我想知道如何避免 Makefile 中出现一些回声 clean rm fr o 该规则将打印 gt make clean rm fr o gt 我怎样才能避免这种情况 首先 实际的命令必须位于下一行 或者至少 GNU Make 是这样 它可
  • 在所有存储过程中搜索模式然后打开它进行更改的方法

    如何在所有存储过程中搜索某个模式 然后打开要编辑的存储过程 SQL Server 2005 内部有内置的东西吗 或者是否有任何第三方插件可以进行此搜索 我也在使用 Red Gate 的 SQL Prompt 但我没有注意到该选项 目前我正在
  • Zend_Db:如何从表中获取行数?

    我想知道一个表中有多少行 我使用的数据库是MySQL数据库 我已经有一个 Db Table 类 用于像这样的调用fetchAll 但我不需要表中的任何信息 只需要行数 如何在不调用的情况下获得表中所有行的计数fetchAll count d
  • 重写大型 IN 子句的最高效方法是什么?

    我使用 go 和 gorm 编写了一个 API 它在我们的数据库上运行计算并返回结果 我刚刚达到了参数限制IN使用聚合时的条件 查询示例 SELECT SUM total amount from Table where user id in
  • 使用 While() 结构时 Gridview 不会填充。 C# ASP.Net

    我在使用此网格视图时遇到问题 我正在用查询填充它 但是 如果我使用 while reader Read 结构 它就不会填充甚至不会出现 没有 while 结构 它工作得很好 但是 我需要访问两个特定字段 代码如下 SqlDataReader
  • getLastknownLocation() 在 nexus 上返回 null 值

    我正在开发基于位置的项目 我使用以下代码 我正在为该项目使用 google api 8 lm requestLocationUpdates LocationManager GPS PROVIDER 0 0 this currloc lm g
  • 为什么我们应该总是从函数返回值?

    我不是一个编程高手 但多次听程序员说我们应该始终从函数返回值 我想知道原因 函数不需要返回任何内容 如果您查看 C 函数 您会发现其中许多函数不需要返回任何内容 好吧 不是明确地 void nonReturningFunction cons
  • Python:有限制的非线性优化(Gekko?)

    我希望能够用Python解决以下问题 给定观测数据 x 1 x n 和已知的固定目标 B 和公差 E 求解参数 a0 a1 和 a2 从而最小化 总和 w i 2 其中 w i exp a0 a1x i a2x i 2 具有以下两个限制 s
  • 拆分包含两者的字符串中的数字和字母

    我正在尝试分割以下 或类似 字符串 08 27 2015 07 25 00AM 目前我使用 var parts date split 0 9a zA Z g 这导致 02 27 2012 03 25 00AM 问题在于00AM部分 我也想分
  • 在 Visual Studio 中的项目之间共享预编译头

    我有一个包含许多 Visual C 项目的解决方案 所有项目都使用 PCH 但有些项目打开了特定的编译器开关以满足项目特定的需求 这些项目中的大多数在各自的 stdafx h 中共享相同的标头集 STL boost 等 我想知道是否可以在项