ana*_*lyg 8 c++ gcc gnu-make precompiled-headers
我使用gcc(运行as 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 $@
Run Code Online (Sandbox Code Playgroud)
一切都很好,直到我不得不运行g++不同的命令行参数.在这种情况下,即使precompiled.h.gch存在,也无法使用,编译速度会慢得多.在gcc文档中,我已经读过要处理这种情况,我必须创建一个目录precompiled.h.gch并将预编译的头文件放在那里,每个g++命令行参数都有一个文件.
所以现在我想知道我应该如何改变我的Makefile以告诉我用g++这种方式创建gch文件.也许我可以运行g++只是为了测试它是否可以使用precompiled.h.gch目录中的任何现有文件,如果没有,则生成具有唯一文件名的新预编译头.
gcc是否支持进行此类测试?
也许我可以用另一种方式实现我想要的东西?
回答我自己的问题似乎很奇怪; 无论如何,这里去了.
要检测是否存在合适的预编译头文件,我会在我的头文件中添加一个故意错误:
// precompiled.h
#include <iostream>
#include <vector>
...
#error Precompiled header file not found
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为如果gcc找到一个预编译的头,它将不会读取该.h文件,也不会遇到错误.
要"编译"这样的文件,我首先删除错误,将结果放在一个临时文件中:
grep -v '#error' precompiled.h > precompiled.h.h
g++ -c -x c++ $(MYCCFLAGS) precompiled.h.h -o MORE_HACKERY
Run Code Online (Sandbox Code Playgroud)
这里MORE_HACKERY不仅仅是一个纯文件名,还包含一些代码来创建一个具有唯一名称(mktemp)的文件.为清楚起见省略了它.