首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GNU make创建多个预编译头文件

使用GNU make创建多个预编译头文件
EN

Stack Overflow用户
提问于 2010-12-19 19:38:55
回答 2查看 3.5K关注 0票数 9

我使用的是gcc (以g++身份运行)和GNU make。我使用gcc预编译头文件precompiled.h,创建precompiled.h.gch;Makefile中的以下代码行完成了这项工作:

代码语言:javascript
复制
# MYCCFLAGS is a list of command-line parameters, e.g. -g -O2 -DNDEBUG
precompiled.h.gch: precompiled.h
    g++ $(MYCCFLAGS) -c $< -o $@

一切都很好,直到我不得不用不同的命令行参数运行g++。在这种情况下,即使存在precompiled.h.gch,也不能使用它,并且编译速度会慢得多。在我读过的gcc文档中,为了处理这种情况,我必须创建一个名为precompiled.h.gch的目录,并将预编译头文件放在那里,每个文件对应一组g++命令行参数。

所以现在我想知道我应该如何改变我的Makefile来告诉g++以这种方式创建gch文件。也许我可以运行g++来测试它是否可以使用precompiled.h.gch目录中的任何现有文件,如果不能,则使用唯一的文件名生成一个新的预编译头文件。

做这样的测试,gcc支持吗?

也许我可以用另一种方式实现我想要的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-27 04:01:00

回答我自己的问题似乎很奇怪;不管怎样,下面是我的问题。

为了检测是否存在合适的预编译头文件,我在头文件中故意添加了一个错误:

代码语言:javascript
复制
// precompiled.h
#include <iostream>
#include <vector>
...
#error Precompiled header file not found

这是因为如果gcc找到了预编译头文件,它将不会读取.h文件,也不会遇到错误。

为了“编译”这样的文件,我首先删除了错误,将结果放在一个临时文件中:

代码语言:javascript
复制
grep -v '#error' precompiled.h > precompiled.h.h
g++ -c -x c++ $(MYCCFLAGS) precompiled.h.h -o MORE_HACKERY

在这里,MORE_HACKERY不仅仅是一个普通的文件名,它还包含一些代码来创建一个具有唯一名称(mktemp)的文件。为了清楚起见,它被省略了。

票数 5
EN

Stack Overflow用户

发布于 2015-02-21 00:45:54

有一种比在预编译.h中引入#error更简单的方法:永远不要创建这个文件。无论是G++还是Visual C++ (至少到2005年)都不希望“真正的”文件在那里,如果有预编译版本的话(如果他们得到了必要的编译标志)。

假设我们想要预编译的#includes列表称为"to_be_precompiled.cpp“。文件扩展名不是很重要,但我不喜欢称它为.h文件,因为它必须以不同于真正的头文件的方式使用,如果这是一个.cpp,在Visual C++中使用它会更容易。然后在整个代码中选择一个不同的名称来引用它,让我们称之为"precompiled_stuff“。再说一次,我不喜欢把它叫做.h文件,因为它根本不是一个文件,它是一个用来指代预编译数据的名字。

然后,在所有其他源文件中,语句#include "precompiled_stuff"不是真正的包含,而只是加载预编译的数据。由您来准备预编译的数据。

对于

  • g++,您需要一个构建规则来从一个源文件创建"precompiled_stuff.gch“,该源文件的名称对编译器来说无关紧要(但在这里应该是"to_be_precompiled.cpp”)。
  • 在Visual C++中,字符串"precompiled_stuff“等于/Yu标志的值,并且加载的预编译数据来自一个具有不相关名称的.pch文件,该文件也是从一个不相关的源文件(这里也是"to_be_precompiled.cpp”)创建的。
  • 仅当使用没有预编译头支持的编译器生成时,构建规则需要生成一个名为"precompiled_stuff“的实际文件,最好是在远离真实源文件的构建目录中。"precompiled_stuff“可以是"to_be_precompiled.cpp”的副本、硬链接或符号链接,也可以是包含#include "to_be_precompiled.cpp".

的小文件

换句话说,你认为每个编译器都支持预编译,但对于一些编译器来说,这只是一个哑巴副本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4482740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档