如何有效地使用预编译的头文件(使用/Yc和Yu选项)?
我们正在使用Visual Studio 2003(VC71)进行编译. 为了减少编译时间,我们更改了构建脚本,以便为每个CPP文件生成预编译标头(.pch)文件. makefile中使用的选项: /Yc"StdAfx.h" /Fp"StdAfx.pch" 这样,目标的编译时间减少了30%.但是,任何人都可以帮助我了解即使每次生成PCH文件以用于每个CPP文件的编译时,它如何减少编译器时间. 另外,这是正确的方法吗?我们应该使用YC和YU组合吗? 我不能使用/yu选项,因为PCH文件应至少进行一次. 解决方案 问题 假设您使用的标题列表,您知道不会改变.例如,C标题或C ++标头或提升标头等. 为每个CPP文件汇编读取它们需要时间,这不是富有成效的时间,因为编译器一次又一次地读取相同的标头,并一次又一次地为这些标题产生相同的编译结果. 应该有某种方法告诉编译器这些标题始终是相同的,并缓存它们的编译结果,而不是一次又一次地重新编译它们,否?
2 2024-04-05
编程技术问答社区
GCC的构建时间并没有从预编译的头文件中获益多少
我有一个巨大的项目,约有15万个C ++代码的LOC.建立时间大约是15分钟.该项目由许多不同尺寸的子项目组成. 我已经为每个子标记构建了单独的预编译标头,但是当我使用它们时,构建时间大致相同.似乎建立时间少5-10%,而不是更多. 肯定使用了预编译的标头,我使用-Winvalid-pch选项,并且我尝试使用-H编译器选项进行编译,我的预编译的标头出现在输出中,带有" bang''符号,这意味着编译器能够使用预编译的标头器. 我所有预编译的标头都不是很大,每个文件都大约为50MB. 我使用python脚本,找到在这里生成最常用的预编译标头的列表,因此我的预编译候选人列表非常好. 是否有任何免费/开源工具用于构建优化?似乎标准make实用程序没有测量不同目标的构建时间的能力.我找不到用make获得不同目标的统计信息的方法.我不是在谈论依赖性分析或进步.我只想知道大多数时候浪费了目标. 此外,GCC似乎在处理预编译标题方面效率很低.我无法获得任何构建的任何子构建
6 2024-04-05
编程技术问答社区
在使用Qt Creator / qmake / MinGw进行调试构建时,PRECOMPILED HEADERS不起作用。
在QT Creator中,我使用了一个Pro文件,请使用预编译标头. 当我在发布模式下构建时,构建功能非常完美.但是在调试模式下构建会产生错误,从而生成对象文件失败.示例: 17:12:40: Running steps for project Euclide... 17:12:40: Configuration unchanged, skipping qmake step. 17:12:40: Starting: "C:\Qt\Tools\mingw48_32\bin\mingw32-make.exe" C:\Qt\5.2.0\mingw48_32\bin\qmake.exe -spec win32-g++ CONFIG+=debug -o Makefile ..\euclide\Euclide.pro C:/Qt/Tools/mingw48_32/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering d
26 2024-04-04
编程技术问答社区
SCons、Boost::ASIO、Windows预编译头文件和链接器错误
当我们为多个平台开发C ++时,我正在研究使用SCONS进行构建过程.我是构建配置中的99%,但是我遇到了Windows上的A 非常奇怪的错误,与预编译的标头文件有关.甚至陌生人仍然是仅发生在一个项目上. 在此项目的Sconscript文件中,我有以下内容来编译Windows上的PCH: if env['PLATFORM'] == 'win32': env['PCH'] = env.PCH('MyPCH-LSCommon.pch', 'Common/src/MyPCH.h')[0] env['PCHSTOP'] = '"MyPCH.h"' 我还设有一个编译器标志以强制的编译器标志,包括项目中的所有文件: if env['PLATFORM'] == 'win32': cxxflags = [ '/FI"MyPCH.h"' ] 一切都会进行,并且编译绝对很好.直到最终的DLL链接阶段,我才能获得链接器错误的页面和页面,例如以下内容: e
8 2024-04-02
编程技术问答社区
使用boost库时,加快编译/链接时间
我正在使用有什么想法如何通过Boost Librard提高汇编/链接时间?它是跨平台,因此我需要使用Mac OS X/Linux/PC编译代码. 解决方案 除了通常的技巧之外,您真的没有什么可以做的: 最小化依赖项:仅拉动您真正需要的提升标头,并尽可能使用特定的标题(许多库都有一个"主"标头,例如boost/thread.hpp,但也有一个带有特定标头的子目录,例如boost/thread.hpp C1>), 在可能的情况下,依靠前向声明而不是包括整个标题, 如果可能的话,仅在.cpp文件中包括标题.如果将其包含在标题中,则每次包含标头的翻译单元时都必须对其进行编译.作为一般的经验法则,请尝试最大程度地减少标题中的代码量, 所有主要编译器都支持预编译的标题.用这些减少汇编时间, 尝试 Unity Builds .在您的情况下,这可能不是一个优势. 和最后但并非最不重要的一点是,最终的选择只是不使用那些特定的提升库. 我有时会很早就出于便利而使用某些增强液
6 2024-04-02
编程技术问答社区
如何在Android NDK项目中使用预编译的头文件?
我正在将一个大的C ++项目移植到Android的Visual Studio到GCC.由于文件数量大量,编译时间是冰川的.我想设置一个预编译的标题文件,但是我发现 i具有stdafx.h文件,该文件应该是预编译标头的底座,并且是所有.cpp源中的第一个文件.有人知道我需要添加到Android.mk以使这项工作吗? 解决方案 有相同的问题,因此有一个解决方案.首先,似乎您无法通过更改android.mk文件来完成此操作,因此您应该在NDK构建的系统中更改文件,但这不是很危险的%).该解决方案在R8B NDK上测试.所以: 在# Build the sources to object files之前,将以下代码添加到/build/core/build-binary.mk脚本: 之前 #precompiled helper: ifeq ($(TARGET_ARCH_ABI),x86) $(call set-src-files-target
6 2024-02-17
编程技术问答社区
可以从Xcode项目中删除prefix.pch文件吗?
Xcode项目自动生成prefix.pch文件.当我删除此文件并尝试构建时,我会出现构建错误,说" * _prefix.pch"文件丢失了. prefix.pch文件是用xcode编译的必不可少的? 如何在没有prefix.pch文件的情况下构建? 解决方案 在Xcode中,转到目标的构建设置(命令 - option-e,构建选项卡),并取消选中预编码前缀标头(gcc_precompile_prefix_header).如果需要,还可以删除前缀标头设置的值. 前缀标头被编译并存储在缓存中,然后在编译过程中自动包含在每个文件中.这可以加快汇编加快汇编,并让您在无需使用它向每个文件添加导入语句的情况下包含一个文件.它们不是必需的,每当您更改它们时,实际上会放慢汇编. 其他解决方案 是的,您可以在没有.pch文件的情况下编译和运行项目.在Xcode中,转到目标的构建设置(命令 - option-e,构建选项卡),并取消选中预编码前缀标头(gcc_precompil
22 2023-12-18
编程技术问答社区
如何修复PCH错误?
当我尝试在Xcode中构建我的应用时,我会收到此错误消息: PCH文件由其他分支((Clang-425.0.24))比 编译器((Clang-425.0.27)) 它以前没有发生过,但这是更新Xcode后的第一个构建. 其他应用程序也无效,但该应用程序不起作用. 如果我关闭"Precompile Prefix Header"设置,则可以工作. 如何解决此错误并仍在设置上? 解决方案 这通常是一个缓存问题.通常,可以通过按住选项键并选择 product>清洁构建文件夹... 来解决它. 其他解决方案 删除项目的DerivedData文件夹.在Xcode首选项 - >位置查看以查看保存位置. 其他解决方案 看来 product>清洁构建文件夹... (带有选项键)对大多数人有效.请参阅@Geige的选定答案. 如果您与大多数人不同(包括我自己),这仍然会使您的麻烦XCode可能会使您共享的预编译标题在其他地方.对我来说,他们在一个类似
6 2023-12-18
编程技术问答社区
预先编译的头文件和在OSX上编译通用对象
我们正在使用GCC的预编译标题进行我们的项目,并这样构建它们: gcc $(CFLAGS) precompiledcommonlib.h 现在,我在OSX 10.6上构建该项目,并尝试同时使用所有体系结构的建筑物的漂亮功能: gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c 但是,这似乎对预编译的标题不起作用: gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h Undefined symbols for architecture i386: "_main", referenced from: start in crt1.10.6.o ld: symbol(s) not found for architecture i386 collect2: ld returned 1 exit status Undefined s
6 2023-12-16
编程技术问答社区
C3859: 超过了PCH的虚拟内存范围
我会不时收到此错误消息(不是每次)我编译(编辑:对不起,我在这里没有清楚自己:我实际上是指"重建")我的混合模式项目. Visual Studio告诉我"使用'-zm114'或更大的命令行选项重新编译".原则上没有问题,我只是像VS告诉我一样. 但是目前,有两个问题: 为什么不每次都会进行我进行重建?如果我理解正确的话,编译器在编译我的项目时用完了记忆.因此,如果我进行重建(清洁所有先前的工作),下次是否也不会有任何记忆,如果我不更改任何东西? 要在安全方面,我已经在此项目的所有配置中指定了ZM(IE Zm120)的值120.为什么我会收到一个带有此较低值的错误消息?还是建议的价值为114,只是对? 的疯狂猜测 解决方案 我知道这很旧,但我最终来到这里,所以我也可以回答. 有一篇关于PCH问题的精彩文章=" noreferrer">在这里. 1)为什么每次重建一次都不会发生? 这肯定要回答有点复杂.由于并非每次都在发生,因此可能是几个问题.这
10 2023-11-24
编程技术问答社区
VS2008 win32项目defaults-移除默认的预编译头文件
我一直在遵循每一个选择,试图找到一种方法来获取IDE,让我创建一个没有预编译标题的新的Win32Pject.我已经阅读了这个论坛上的每个线程,其中包含"预二重标头",而我最接近的是: 预编译标题 使用2008 pro(不明确,尽管行为似乎相似)我去: 文件 - >新 - >项目 这打开了我选择Visual C ++ Win32项目的新项目对话框,输入名称并点击确定. 然后我得到了" Win32应用程序向导".将应用程序类型设置为" Windows Application",应用程序设置窗格将不允许我取消选中预编译的标头.复选框已亮了.如果我选择"控制台应用程序",我可以取消选中它,但是我正在创建一个GUI应用程序. 当我单击完成时,我在xxx.cpp,四个标头文件和强制性stdafx.cpp中获得6码的代码. 也许我可以删除并删除所有这些内容,然后进入属性并关闭PCH,但这是我想编写的许多小型项目示例的Hasssel. 我只想要一个将编译到
8 2023-11-23
编程技术问答社区
Visual Studio中的 "创建预编译头"(/Yc)和 "使用预编译头"(/Yu)有什么区别?
我在MSDN中阅读了该文档,但最后我并没有清楚地知道它们之间的实际区别是什么.两者似乎都需要在每个 *.cpp文件的顶部添加stdafx.h. 我正在使用VS2008. 任何人可以帮助清理问题吗? 解决方案 好吧,我认为您必须首先了解预编译标题的目的.在大型项目中,例如,处理单个客户端扩展名所需的所有标题可能需要年龄,因此有些人更喜欢分发.pch文件及其库.为了生成.pch文件,您可以使用/Yc编译器标志,想要消费库的人将设置/Yu标志.参见在这里library/z0atkd6c.aspx">此处有关详细信息. 其他解决方案 如何在Visual Studio中使用PCH文件的简短摘要: 项目中的所有CPP文件都必须包括stdafx.h(如果需要的话,可以将其更改为其他) 在解决方案资源管理器和Properties -> C++ -> Precompiled Headers中选择"创建/使用预编译标题"中的项目.点击应用 当属性页面仍显示在解决方案资源
头文件中预编译的头文件
我今天第一次遇到了预编译标题.我不敢相信编译我的C ++代码可能会这么快.现在完全有意义.. 无论如何,让我感到困惑的一件事是,从我到目前为止我阅读的内容,仅应将预编译的标题添加到源文件(CPP?). 在Visual Studio中,Project Properties-> C/C ++ - >先进到" Force Include File"下有一个选项.我将该编译器选项设置为 stdafx.h . 执行此操作后..我不再需要包括我添加到 stdafx.h 的标题,即使在我的标头文件中(源文件应该自动包含stdafx.h).这是预期的行为吗? 我找不到一个在标题/源文件之间的区别的地方. 如果确实如此.是的.至少在GCC和VC ++之间. 解决方案 stdafx.h实际上只能包含在源文件中,而不是标题中.我建议您首先在每个CPP中#include" stdafx.h",而不是使用" inception include file"选项.那就是我如何在跨
36 2023-11-20
编程技术问答社区
在头文件或源文件中包括stdafx.h?
我有一个名为stdafx.h的标头文件,当然,该标题文件是预编译的. 我已经读到,我应该将这些文件包括在我的.cpp文件中,但是随附的标题文件中已经需要其中一些语句. 我应该将STDAFX添加到我的标题中还是将其添加到我的CPP中?我认为将其放入标题是一个好习惯,但是我似乎不得不将其放入标题中. 示例: stdafx包含freeglut. 我的类标题文件具有Glenum的属性. 我应该将STDAFX包括在类的.h中吗? 解决方案 stdafx.h 应该在项目中的每个CPP文件中首次包含. 考虑 c ++不编译标头文件,只有CPP文件. 因此,如果STDAFX是CPP文件中的第一个包含在CPP文件中,则编译器将拥有标题文件所需的一切,当它击中CPP文件中的标题文件 .. ,例如 您有A.CPP和A.H. A.H需要STD:字符串. 您有B.CPP和B.H B.H需要A.H因此B.H需要STD :: String.
10 2023-11-20
编程技术问答社区
在CMake中使用预编译的头文件
我已经在网上看到了一些(旧的)帖子,以涉及将CMAKE预先编译的标头组合在一起.他们似乎都在这个地方有点全面,每个人都有自己的方式.目前最好的方法是什么? 解决方案 cmake刚刚获得了对PCH(预编译标头)的支持,可从 3.16(2019年10月发布)开始: /a> target_precompile_headers( [header1...] [ [header2...] ...]) 通过REUSE_FROM关键字例如这里. https://blog.qt.io/blog/2019/08/01/precompiled-headers-headers-headers-and-unity-unity-jumbo-builds-in-imbo-builds-in-in-comake-cmake/ 其他解决方案 I
6 2023-11-20
编程技术问答社区
如何修复构建时丢失的.pch文件?
当我在Visual Studio中构建C ++解决方案时,它会抱怨XXXXX.PCH文件缺少.我是否缺少设置以获取预编译的标头? 这是完整性的确切错误: Error 1 fatal error C1083: Cannot open precompiled header file: 'Debug\xxxxx.pch': No such file or directory 解决方案 注意:IDE的以后版本可以使用" PCH"而不是相关文件的默认名称中的" stdafx".在下面的说明中,可能有必要将PCH代替STDAFX.我道歉.这不是我的错. 在解决方案资源管理器中右键单击您的项目. 单击下拉菜单底部的属性. 在属性页的左上方, 从下拉菜单中选择所有配置. 打开C/C ++树,然后选择预编译标头 预编译标头:选择使用(/yu) 填写预编译的标头文件字段.标准是stdafx.h 单击好的 如果您的标题文件中没有stdafx.h,则将其放在
28 2023-11-20
编程技术问答社区
预编译的头文件和Visual Studio
是否有一种设置Visual Studio解决方案参数的方法,因此它只是在不构建整个解决方案的情况下创建预编译标题. 具体来说,这是一个巨大的C ++解决方案,本身具有许多项目. 谢谢. 解决方案 仅选择PCH创建器源文件(通常是stdafx.cpp),然后编译该(Ctrl-f7,或右键单击它并选择"编译") 更多信息,因为它似乎对您不起作用: 在每个使用预编译标头的项目中,都有一个用于创建PCH文件的源文件,其余的只有使用 pch文件.该源文件通常仅由一行: 组成 #include "StdAfx.h" " stdafx.h"是Visual C ++中默认的预编译标题名称,它可能是您的其他东西.如果您单独编译" stdafx.cpp",则会生成一个名称为" your_project_name.pch"的文件(同样,这只是默认值).您应该在中间目录中看到它,与所有OBJ文件相同.这是预编译的标题.如果您确实喜欢我说的,并且选择了"编译"而不是"构建",那么
16 2023-11-20
编程技术问答社区
在预编译的头文件中包括 resource.h 是一个好主意吗?
VS-IDE将写入资源标头文件//{{NO_DEPENDENCIES}}. 该评论实际上是一项功能,可以防止(不必要)重建包括资源标头的CPP文件. . 但是,喜欢 sysdn 到"不良副作用". 在我们的项目中,我们确实在stdafx.h中包含resource.h进行预兼容.不幸的是,如果资源文件更改,则预编译的标头不会重建... 如果删除了no_depentencies,则有效(但它再次编写,如果通过IDE更改了资源). 是否有一种方法可以防止IDE每次更改文件时将//{{NO_DEPENDENCIES}}写入resource.h文件? 我认为最好的方法是将resource.h从预编译的标头文件中排除,然后将它们重新包含在所需的.H和.CPP文件中.这样,只有受影响的文件需要(手动!)重建而不是所有文件(如果PCH被重新编译,将会发生). 有任何评论? 解决方案 我同意您自己的建议:resource.h文件可能不应该是预编译标题文件的一部分.
8 2023-11-20
编程技术问答社区
当在多个文件中使用#pragma hdrstop(不带参数)时,会有什么作用?
将#pragma hdrstop(无文件名参数)放在几个源(CPP)文件中的实际值("它是什么")? 请注意, msdn docs 对我来说(再次)和泥一样清晰. 编辑/注意:我要问这个,因为此答案及其链接的文章似乎建议.但是我不明白每个汇编单元必须具有 em pch文件的好处. 解决方案 最初问题的答案是,在没有/yc或/yu集的文件中将#pragma hdrstop放在文件中的目的是忽略它,因此您可以设置一个构建配置和其他使用预编译标头构建的构建配置,您无需更改代码或完全包含的标题. 更多细节... MSDN上的注释说:" HDRSTOP PRAGMA为您提供了对预兼容文件名称以及保存汇编状态的位置的其他控制."这是真的,但并不是特别明显的确切有用... 简而言之. 将#pragma hdrstop放在没有用/yc或/yu汇编的源文件中. 如果您的/yu设置为文件,则HDRSTOP告诉编译器在出现HDRSTOP的行之前扔掉所有内容,然后插
8 2023-11-20
编程技术问答社区
Visual C++预编译头文件错误
更新: 在我的标题文件中包括stdafx.h有什么影响? 我从Linux/Eclipse CDT中的C ++项目开始,并将其导入到Visual C ++/Windows中. 在Visual C ++中,我开始使用预编译标头来加快编译并定义了stdafx.cpp和stdafx.h. 这是我的stdafx.h #pragma once #include #include #include ... 和我的stdafx.cpp #include "stdafx.h" 在每个.h和.cpp文件中,我都有以下内容: #pragma once //if in a header file #include "stdafx.h" 对于发行版和调试,我已经"创建预编译标头(/yc)".它在调试模式下进行了良好的编译,但是在发布模式下它会继续报告 error LNK2005: ___@@_PchSym
18 2023-11-20
编程技术问答社区