您将必须运行编译器两次,但可以节省编译时间
在-std=c++98 pass 上并通过仅指定语法检查来避免生成不需要的目标文件。你这样做
传递选项-fsyntax-only。
您还需要修改您的 make 以跳过 C++98 的链接,因为没有可链接的内容。
您可以做到这一点的最有效方法可能是在
以下几行:
.phony: all clean
SRCS = foo.cpp
FLAT_SRCS = $(patsubst %.cpp,%.ii,$(SRCS))
OBJS = $(patsubst %.ii,%.o,$(FLAT_SRCS))
%.ii: %.cpp
g++ -std=c++98 $(CPPFLAGS) -E $< > $@ && g++ -std=c++98 -fsyntax-only $@
%.o: %.cpp
%.o: %.ii
g++ -c -o $@ $(CPPFLAGS) $(CXXFLAGS) $<
all: foo
foo: $(OBJS)
g++ -o $@ $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(LDLIBS)
clean:
rm -f $(OBJS) $(FLAT_SRCS) foo
这里,%.ii: %.cpp 规则将首先将.cpp 预处理为.ii,
然后将已经预处理的源代码传递给 C++98 语法检查通道,
不会产生新文件。
空的%.o: %.cpp 规则会覆盖隐式规则,否则
导致.cpp 编译为.o,并替换为%.o: %.ii
编译.ii 的规则。 g++ 将.ii 识别为已预处理
C++源代码,所以不会二次预处理源代码。
代码只预处理一次,目标代码只生成一次。
链接和往常一样。如果 C++98 语法检查通过,make 将如下所示:
$ make
g++ -std=c++98 -E foo.cpp > foo.ii && g++ -std=c++98 -fsyntax-only foo.ii
g++ -c -o foo.o foo.ii
g++ -o foo foo.o
rm foo.ii
您会注意到make 会自动删除预处理后的.ii,这很好:
它只是.cpp 和.o 之间的一个管道。
话虽如此,我支持@Matt McNabb 的意见,即你无能为力
以此为利!鉴于您的代码是 C++98,编译器不会更好地优化它
当指示它必须是 C++98 时而不是时。到 GCC 到达
业务优化阶段,它不再关心什么样的源代码
它开始于。
你可能会假设-std=c++98,当给出 g++ 4.x 时,会导致
整个编译器的行为就像是 g++ 2.x。不是这样。它仍然是 g++ 4.x,带有
g++ 4.x优化技术等,按照C++98的语言定义操作。
如果您的代码由于某种原因必须通过,这肯定是有道理的,
作为 C++98,在一些比您的发布编译器更旧的编译器上,在这种情况下,您
需要区分makefile中的编译器。但显然这不是
案子。你也可以用-std=C++98进行常规编译