我使用的是gcc (以g++身份运行)和GNU make。我使用gcc预编译头文件precompiled.h,创建precompiled.h.gch;Makefile中的以下代码行完成了这项工作:
# 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支持吗?
也许我可以用另一种方式实现我想要的东西?
发布于 2010-12-27 04:01:00
回答我自己的问题似乎很奇怪;不管怎样,下面是我的问题。
为了检测是否存在合适的预编译头文件,我在头文件中故意添加了一个错误:
// precompiled.h
#include <iostream>
#include <vector>
...
#error Precompiled header file not found这是因为如果gcc找到了预编译头文件,它将不会读取.h文件,也不会遇到错误。
为了“编译”这样的文件,我首先删除了错误,将结果放在一个临时文件中:
grep -v '#error' precompiled.h > precompiled.h.h
g++ -c -x c++ $(MYCCFLAGS) precompiled.h.h -o MORE_HACKERY在这里,MORE_HACKERY不仅仅是一个普通的文件名,它还包含一些代码来创建一个具有唯一名称(mktemp)的文件。为了清楚起见,它被省略了。
发布于 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"不是真正的包含,而只是加载预编译的数据。由您来准备预编译的数据。
对于
#include "to_be_precompiled.cpp".的小文件
换句话说,你认为每个编译器都支持预编译,但对于一些编译器来说,这只是一个哑巴副本。
https://stackoverflow.com/questions/4482740
复制相似问题