jjzjj

c++ - Eclipse CDT - 预编译 header

coder 2024-02-22 原文

我正在寻找一种直接的方法来使用 Eclipse/CDT 为 C++ 项目使用预编译头文件。这些东西在从命令行运行时确实有效,但我正在寻找一种将其集成到 Eclipse 中的简单方法。

有什么建议吗?!

最佳答案

只是为了帮助其他可能偶然发现这一点的人(因为我花了一些时间来解决这个问题)

首先要做的是使用 pch.cpp 和 pch.h 文件创建一个 PCH 文件夹(如果需要)。

pch.cpp:(这个文件是用来编译.gch的)

#include "pch.h"

pch.h:

#include <iostream>
#include <string>
// more stuff that's not changing anytime soon...

要做的第二件事是创建 PCH 构建配置。

从这个构建中排除所有项目源文件。 (我们只需要编译pch.cpp)
选择文件/文件夹 > 右键单击​​ > 资源配置 > 从构建中排除 > PCH

现在我们需要将其编译为.gch(预编译头文件)
pch.cpp > 右键单击​​ > 属性 > C/C++ 构建 > 设置 > 工具设置
编译器 > 模式:${COMMAND} ${FLAGS} ${INPUTS}(删除所有输出内容)
其他 > 标志:-c -x c++-header -o "../src/PCH/pch.h.gch"

现在,当您使用此配置构建时,它将在 pch.h 所在的位置生成 pch.h.gch。
(它还会在尝试创建 exe 时出现无意义的错误。忽略它即可)


回到正常的 Release 构建,排除 pch.cpp,因为您不需要编译它。

现在是时候测试 .gch 是否在 .h 上使用了

在 pch.h 的顶部放置 #error "not using precompiled header file"

只有在编译文件中首先包含 header 时,才会使用 .ghc。

"Only one precompiled header can be used in a particular compilation."

您应该预编译最适合不同编译单元的不同头文件选择


编译测试

没有预编译头文件
花费 34s.189ms 输出 src=2,143,078 字节 exe=1,346,864 字节

with -include ../src/PCH/pch.h(包含在每个编译单元中)(只有 pch.h 而不是 .gch)
花费 48s.364ms 输出 src=2,159,431 字节 exe=1,355,298 字节
(这就是为什么我们在需要的地方手动 #include,这样在没有 .gch 的情况下编译仍然需要大约 34 秒)

使用 -include ../src/PCH/pch.h 和 pch.h.gch(快速编译,但使用 -include 仍然效率低下)
花费 22s.535ms 输出 src=2,159,431 字节 exe=1,355,298 字节

如果 pch 的组织/使用得当(正确选择 header 和文件以包含它们)(不是在每个文件中都使用)它应该比 22s 快得多。 (这个测试只是在一个没有考虑到 pch 的项目上完成的)


额外的加速可以使编译时间增加三倍
项目 > 属性 > C/C++ 构建 > 行为 > 启用并行构建

关于c++ - Eclipse CDT - 预编译 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16020869/

有关c++ - Eclipse CDT - 预编译 header的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  3. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  4. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  5. ruby - ruby 脚本可以预编译成二进制文件吗? - 2

    我正在开发一个Ruby脚本,需要在没有Ruby解释器的情况下部署到系统上。它将需要在使用ELF格式的FreeBSD系统上运行。我知道有一个ruby​​2exe项目可以编译在Windows上运行的ruby​​脚本,但是在其他操作系统上这样做容易吗?甚至可能吗? 最佳答案 您是否检查过Rubinius或JRuby是否允许您预编译您的代码? 关于ruby-ruby脚本可以预编译成二进制文件吗?,我们在StackOverflow上找到一个类似的问题: https://

  6. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  7. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  8. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  9. ruby - Ruby 中字符串运算符 + 和 << 的区别 - 2

    我是Ruby和这个网站的新手。下面两个函数是不同的,一个在函数外修改变量,一个不修改。defm1(x)x我想确保我理解正确-当调用m1时,对str的引用被复制并传递给将其视为x的函数。运算符当调用m2时,对str的引用被复制并传递给将其视为x的函数。运算符+创建一个新字符串,赋值x=x+"4"只是将x重定向到新字符串,而原始str变量保持不变。对吧?谢谢 最佳答案 String#+::str+other_str→new_strConcatenation—ReturnsanewStringcontainingother_strconc

  10. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

随机推荐