我有一个预编译的标头stdafx.h,该标题stdafx.h在我的项目中的所有源文件中都使用.因此,stdafx.h中的所有标题均在项目中的所有代码文件中可用. 我不确定的是是否要重新包含预编译标题中的内容.你们怎么看? 例如 stdafx.h #pragma once #include my_class.h #pragma once #include // Re-include or not that's the question. Best practice? struct my_class { }; typedef std::shared_ptr my_class_ptr; main.cpp #include "stdafx.h" #include "my_class.h" int main() { } 解决方案 我将包含在内,以便可以将标题重复使用,该项目具有不同的s
以下是关于 precompiled-headers 的编程技术问答
这是我的.pch文件 - // // Prefix header for all source files of the 'English Club' target in the 'English Club' project // #import #ifndef __IPHONE_4_0 #warning "This project uses features only available in iOS SDK 4.0 and later." #endif #ifdef __OBJC__ #import #import #import #import "Helper.h" #import "Animations.h" #import "Constants.h"
很久以前,我曾经使用预编译的标头:加快汇编和b.因为我支持多种开发工具,例如CodeWarrior,MPW,VS,ProjectBuilder,GCC,Intel编译器等 现在,我有一个带有32GB RAM的Mac Pro. 现在我只使用cmake. 所以我们真的还需要预先编译的标题吗? 我只是看不到/知道的明显好处吗? 如何制作跨平台预编译标头?也许这也可以简化我的生活. 解决方案 没有"足够快"的构建之类的东西. tdd的支持者( test-test-driven dravention development )如果他们的构建需要更长的时间几秒钟,因为它使他们的开发风格的周转速度要慢得多. 我通过与预编译的标头合作一半(或更长)的编译时间进行了数小时的编译时间工作,因此,好处可能很大,尤其是对于已经忽略了一段时间的构建时间的项目. 但是,首选解决方案仍然是,通过控制代码的物理依赖性,编译时间永远不会失控. 有关更多信息,请阅读其他解
好吧,这与问题有关"目标c"中的常数 . i创建常数及其相应的常数. // Constants.h extern int const BOOKS; typedef enum SSDifficultyLevel { EASY = 0, MEDIUM = 1, HARD = 2 } SSDifficultyLevel; // Constants.m int const BOOKS = 66; 我的问题:enum可以在中typedef'd吗?该代码编译良好(到目前为止尚无警告或错误),但是我想知道这是否是正确的方法,因为相关问题中提供的解决方案涉及分解常数的定义和声明. 谢谢. 解决方案 好吧,常数和枚举的目的不同(尽管有一些明显的重叠).因此,除非您有真正的理由打破该规则,否则不要距离人们的期望太远. 就个人而言,我不喜欢"全球常数标题",因为您通常应该将这些声明与它们所使用的声明联系起来.例如,Apple的框架通常会声明其与之相关的接
我使用MINGW的预编译标头文件遇到问题.编译器似乎找到了预编译的标头文件,但是CC1Plus.exe立即崩溃(cc1plus.exe已停止工作). 我了解到这可能与cc1plus.exe的低堆栈大小有关,所以我做了以下操作以增加它: editbin cc1plus.exe /STACK 33554432 ,我也试图无济于事: editbin cc1plus.exe /STACK 32768k 但是,每当我尝试编译我的应用程序时,它仍在不断崩溃,因为它仍然会崩溃. 顺便说一句,我使用了最新的mingw(GCC V 4.6.2)和最新的Eclipse CDT(如果很重要). 我是否正确地增加了cc1plus.exe的堆栈大小? 当我阅读无数文章和主题时,有人是否有任何线索进行操作,但我目前有点不概念. g ++似乎可以找到并接受我的预编译标题文件: Building file: ../src/AdvancedOgreFramework.cp
我会不时收到此错误消息(不是每次)我编译(编辑:对不起,我在这里没有清楚自己:我实际上是指"重建")我的混合模式项目. Visual Studio告诉我"使用'-zm114'或更大的命令行选项重新编译".原则上没有问题,我只是按照VS告诉我. 但是目前,有两个问题: 为什么每次都不会发生我进行重建?如果我理解正确的话,编译器在编译我的项目时用完了记忆.因此,如果我进行重建(清洁所有先前的工作),下次不应该在记忆中耗尽,如果我不更改任何东西? 要在安全方面,我已经在此项目的所有配置中指定了ZM(IE Zm120)的值120.为什么我会收到带有此较低值的错误消息?还是建议的价值为114,只是一个疯狂的猜测vs? 解决方案 我知道这很旧,但我最终来到这里,所以我也可以回答. 有一篇关于PCH问题的精彩文章在这里. 1)为什么每次重建一次都不会发生? 这有点复杂,可以肯定地回答.由于并非每次都在发生,因此可能是几个问题.这很可能是由于内存分配.从文章中:
希望您能帮助我,因为我不知道发生了什么.在尝试将BeeCrypt库添加到我的项目时,我有以下错误: 致命错误C1010:在寻找预编译标头时,文件的意外结束.您是否忘记了将#include" stdafx.h"''''添加到您的来源? 实际上,我没有忘记将#include" stdafx"添加到我的来源.编译器将错误指向此.CXX文件的末尾: #define BEECRYPT_CXX_DLL_EXPORT #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "beecrypt/c++/security/SecureRandom.h" #include "beecrypt/c++/security/SecureRandomSpi.h" #include "beecrypt/c++/security/Security.h" using namespace beecrypt::security; Secur
我正在使用有什么想法如何通过Boost库来增加汇编/链接时间?它是跨平台,因此我需要使用Mac OS X/Linux/PC编译代码. 解决方案 除了通常的技巧之外,您真的没有什么可以做的: 最小化依赖项:仅拉动您真正需要的升压标头,并尽可能使用特定的标题(许多库都有一个"主"标头,例如boost/thread.hpp,但也有一个带有特定标头的子目录,例如boost/thread.hpp C1>), 在可能的情况下,请依靠正向声明而不是包括整个标题, 如果可能的话,仅在.cpp文件中包括标题.如果将其包含在标题中,则每次包含标头的翻译单元都必须进行编译.作为一般的经验法则,请尝试最大程度地减少标题中的代码量, 所有主要编译器都支持预编译的标题.用这些减少汇编时间, 尝试 Unity Builds .在您的情况下,这可能不是一个优势. 和最后但并非最不重要的一点是,最终的选择只是不使用那些特定的增压库. 我有时会很早就出于便利而使用某些Boost Libs,
通常的方法是在包含最常见的项目中拥有一个预编译标头. 问题是,它太小或两个大.当它太小时,它不会覆盖所有用过的标头,因此必须在每个模块中一遍又一遍地处理这些标头.当它太大时,由于两个原因,它会减慢汇编的速度太大: 当您更改预编译标题中包含的标头时,该项目需要经常重新编译. 预编译的标题太大,因此将其包括在每个文件中实际上都会放慢汇编. 如果我将所有标题文件放在项目中,该怎么办.这将添加一些额外的编译器工作来预编译它们,但是随后它可以很好地工作,因为没有任何标头必须进行两次处理(即使准备预编译的标题也会递归使用预编译的标题),也不必放入其他内容.重新编译的模块和仅需要重新编译的模块.换句话说,对于额外的工作,o(n)复杂性我(理论上)优化o(n^2)C ++的组合包括. O(n)的预求人,预编译数据的处理仍然是O(n^2),但至少最小化. 有人尝试过吗?它可以在现实生活中增加编译时间吗? 解决方案 带有请参阅此答案用于更详细的说明(专门针对GCC). .
上下文 我们有一个大项目,因此该应用程序与一些常见的代码分开.每个人都有自己的存储库,并且该应用程序通过Cocoapods将通用代码用作LIB. 情况 现在,我们需要切换LIB中包含的一些非常具体的功能.但是启用/禁用的条件是在应用程序prefix.pch文件中定义的宏(我知道,不酷). 问题 LIB中的代码(包括作为POD)未"查看" PCH文件中定义的宏.因此,我们实际上无法切换此行为. sum-up 我唯一看到的替代方法是在我们的podfile中添加后安装挂钩,但似乎主要适用于在构建设置中定义的宏.在这种情况下,宏是在PCH文件中定义的.而且我真的真的不想在lib或podfile中添加值. 将我指向正确方向的任何建议或想法将不胜感激! 解决方案 无法在Cocoapod的源代码中使用应用程序项目的宏 - 这是因为在应用程序目标甚至开始构建之前,将建立整个POD目标,因此没有办法知道宏. 我的第一个本能是像您提到的那样使用后
我们正在使用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
我已经在网上看到了一些(旧的)帖子,以涉及将CMAKE预先编译的标头组合在一起.他们似乎都在这个地方有些全面,每个人都有自己的方式.目前最好的方法是什么? 解决方案 有一个第三方Cmake Module名为" cotire" 自动使用预编译基于CMAKE的构建系统的标题,还支持Unity Build. 其他解决方案 cmake刚刚获得了对PCH(预编译标头)的支持,应在即将发布的3.16版本中提供2019-10-01: /a> target_precompile_headers( [header1...] [ [header2...] ...]) 正在进行关于支持目标之间的共享PCH的讨论: https://gitlab.kitwareware .com/cmake/cmake/essess/19659 htt
当我尝试在Xcode中构建我的应用时,我会收到此错误消息: PCH文件由其他分支((Clang-425.0.24))比 编译器((Clang-425.0.27)) 它以前没有发生过,但这是更新Xcode后的第一个构建. 其他应用程序也无效,但该应用程序不起作用. 如果我关闭"Precompile Prefix Header"设置,则可以工作. 如何解决此错误并仍在设置上? 解决方案 这通常是一个缓存问题.通常,可以通过按住选项键并选择 product>清洁构建文件夹... 来解决它. 其他解决方案 删除项目的DerivedData文件夹.在Xcode首选项 - >位置查看以查看保存位置. 其他解决方案 看来 product>清洁构建文件夹... (带有选项键)对大多数人有效.请参阅@Geige的选定答案. 如果您与大多数人不同(包括我自己),这仍然会使您的麻烦XCode可能会使您共享的预编译标题在其他地方.对我来说,他们在一个类似
我正在研究一个数据库项目,该项目将查询(以某些更高级别的语言表示)编译为C ++代码.该代码由数据库编译和执行.该部分效果很好. 现在,我正在尝试减少C ++查询代码的编译时间.我想知道我是否可以使用预编译的标题在这里获得性能. 查询被翻译成一个名为query.cpp的文件,其中包括库/src/database.hpp. Database.hpp文件包含更多文件,例如standardTypes.hpp等.我可以将所有这些标头文件进行预编译以加快Query.cpp的汇编吗?如果是,我该怎么做?到目前为止,我还找不到预编译标头的任何好示例,只有一些真正的基本内容. 我使用以下命令来编译QUERY.CPP: clang++ -fPIC -std=c++11 Query.cpp -I./library/src/ -shared -o libquery.so; 解决方案 创建预编译的标头包含您不更改为查询的所有标题.h并使用: clang -cc1 Query.
是否有一种设置Visual Studio解决方案参数的方法,因此它只是在不构建整个解决方案的情况下创建预编译标题. 具体来说,这是一个巨大的C ++解决方案,本身具有许多项目. 谢谢. 解决方案 仅选择PCH创建器源文件(通常是stdafx.cpp),然后编译该(CTRL-F7,或右键单击它并选择"编译") 更多信息,因为它似乎对您不起作用: 在每个使用预编译标头的项目中,都有一个用于创建PCH文件的源文件,其余的仅使用使用 pch文件.该源文件通常仅由一行: 组成 #include "StdAfx.h" " stdafx.h"是Visual C ++中的默认预编译标题名称,它可能是您的其他东西.如果您单独编译" stdafx.cpp",则会生成一个名称为" your_project_name.pch"的文件(同样,这只是默认值).您应该在中间目录中看到它,与所有OBJ文件相同.这是预编译的标题.如果您确实喜欢我说的,并且选择了"编译"而不是"构建",则
在Visual Studio 2015中,我有一个C ++/CLI项目,其中有以下错误: "致命错误c1010:在寻找预编译标题时,文件的意外结束.您是否忘记了将'#include" stdafx.h"添加到您的来源吗?" 我关闭了项目选项中的预编译标题,但它不断给我同样的错误.我什至删除了预编译标头文件的名称,但仍然说"stdafx.h". 编辑: 是的,每个源文件都不启用它. 解决方案 好的.汉斯·普(Hans Passant)发现发生了什么: 我用来构建的构建配置仍然启用了预编译标题. 其他解决方案 您可能已经为项目禁用了它,但是每个源文件都可以具有自己的特定编译器设置.您也可能禁用特定源文件的预编译标头,错误地将该操作误认为项目范围的设置. 对于解决方案资源管理器中的每个单独的C/C ++文件,右键单击它,然后选择"属性".在C/C++ -> Precompiled Headers下,请确保设置"不使用预编译头". 在解决方案资
如果我即使在空的.cpp中也不包括stdafx,我会得到此错误 fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source? 为什么我甚至需要将其包含在虚拟文件中? 解决方案 如果使用它们,则必须包括它们.但是您可以在项目属性中关闭它们. 但是,使用它们的建议推荐是" infort incluce" 命令行的pch,以便文件 本身不包含PCH.这样,源文件可以与其他系统兼容. 其他解决方案 您可以在每个翻译单元(在给定的CPP文件的属性中)禁用预编译标头.如果您愿意探索配置GUI,则可能也可以每个项目进行.并非所有项目类型都指定PCH;它只是标准的Microsoft方式. 我从未在Microsoft Land外面遇到过它们,因此"在C