- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 clang++ 命令行来了解预编译 header 的工作原理。我有这样的东西:
clang++ [several lines of options] sourcefile.cpp -o sourcefile.o -include durr.h -include hurr.h
其中通过命令行包含的两个 header 已预编译到相应的 .h.pch 文件中。
如果我只“-include”两个头文件中的一个,编译就会成功,并且比我不包含任何一个都更快,这是预编译头文件的正常方式。但是当我同时包含这两者时(如上所述),我得到了这个错误:
clang: warning: precompiled header 'hurr.h.pch' was ignored because '-include hurr.h' is not first '-include'
有没有办法(不一定要使用-include)使用多个.h.pch预编译头文件来加速一个.cpp文件的编译?我知道预处理器倾向于导致 header 相互影响(即使仅通过包含防护),这样的功能会变得非常复杂。我真的不希望得到我想要的支持,现在我已经考虑了一下。但我想在这里确认。上面的错误信息是提示性的但并不全面,而且 Clang 用户手册似乎也没有告诉我答案....
最佳答案
结果是:Clang 支持“链接”PCH 文件,这是一种允许一个 PCH 代表另一个 PCH 的扩展的特性。如果后者在稍后的编译过程中被包含,那么它和它所依赖的 PCH 都将被用来加速编译。我想。
像这样的东西可能会产生一个普通的 PCH:
clang++ -x c++-header header1.h -o header1.h.pch
而且,如果我理解正确(有疑问),那么像这样的东西会产生一个链式 PCH,它会扩展 header1.h.pch:
clang++ -x c++-header header2.h -o header2.h.pch -include-pch header1.h.pch
然后可以使用两个 PCH 文件链来加速编译,如下所示:
clang++ source.cpp -o source.o -include-pch header2.h.pch
(不需要在命令中提及父 PCH;我认为 header2.h.pch 已经知道在哪里可以找到它。)
我还没有找到任何方法来通过命令行明确要求这种“链接”。在编译另一个 PCH 时简单地包含一个 PCH 似乎会产生一个链接的 PCH ...可能。我的证据表明它确实存在,主要是在 header2.h 实际上包含 header1.h 的情况下,这种技术似乎会产生一个小的 header2.h.pch 和一个大的 header1.h.pch,尽管人们会期望如果链接不存在如果发生这种情况,header2.h.pch 通常会比 header1.h.pch 大,因为它至少包含同样多的信息。这似乎符合我所理解的 PCH 链接的目的:它通过存储依赖 PCH 的重复信息作为对另一个 PCH 内容的廉价引用来节省资源。
我的随意探索表明,一个依赖的 PCH 本身可能有另一个依赖它,将链扩展到三个或更多步骤,尽管我不确定这一点。当我试图通过大约 15 或 20 个链接来扩展涉及真实代码的链时,PCH 文件大小最终以一种看似错误的方式爆炸,每一步大约增加一倍。这最终为 header 生成了 300 MB PCH 文件,如果在不尝试链接的情况下将其编译到 PCH 中,将生成小于 6 MB 的文件。这发生在 Clang 3.6.something 和 Clang 3.7.0 中。我想这是一个错误,但谁知道呢。在达到我想要确定并报告它的地步之前,我放弃了我的探索。也许 PCH 链无论如何都不会变得很长。这个功能似乎不是人们通常使用的东西....
无论如何,似乎没有办法做我真正想要的事情:混合任意两个任意 PCH,只要它们不直接相互冲突,无论它们是如何创建的。如果一个依赖于另一个,链接只允许两个 PCH 一起使用。我一直对通过为项目中的每个 header 创建一个 PCH,然后在编译期间适本地将 PCH 组混合在一起来加快编译速度感兴趣。但是用链接的 PCH 来完成这个似乎需要制作一个 PCH 文件树,其中多个 PCH 可能对应于一个头。我实际上试图自动生成这样的东西,并且似乎成功了......但是上面提到的“错误”(如果是错误的话)让我陷入困境,并且在我成功的程度上,节省的时间并不令人印象深刻足以保证继续。
Clang 中还有某种“模块”系统可能与此相关。但我的印象是,试图利用它来达到我想要的效果,如果它甚至可以成功的话,可能需要我将我的源代码更改为一些特殊的东西,也许是一些非标准的东西。虽然我没有仔细研究它,所以也许不是。但无论如何,我猜标准 C++ 最终可能会获得模块,然后所有这些困惑将(我希望)成为过去。
顺便说一句,GCC 似乎不支持任何与我想要的相关的东西。
关于c++ - 有什么办法可以同时使用多个预编译头文件和 Clang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34714183/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!