1

在 GCC 中,我们可以运行简单的预处理器:

g++ -E x.cpp > temp.cpp

但是,在有这么多makefiles 的大型项目中;提到所有的依赖关系非常麻烦。例如

g++ -I /home/x1 -I /home/x2 ... -DMACRO1 -DMACRO2 ... -E x.cpp > temp.cpp

有什么方法可以通过使用makefile,我们可以运行 C 预处理器?

4

2 回答 2

1

使用.cpp预处理文件的后缀是一个坏主意,因为它与.cppC++ 文件的后缀冲突。试试别的 - 这是一个你可以开始使用后缀的片段.e

CXX      = g++
CPPFLAGS = -E
CXXFLAGS = -Wall -DMACRO1 -DMACRO2
INCLUDES = -I /home/x1 -I /home/x2

%.e : %.c
        $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(INCLUDES) $< -o $@

小心在'recipe'的开头放置一个TAB(“$(CXX) $(CFLAGS) ...”行)。上面的东西定义了一个规则,告诉make如何.e从文件构建.cpp文件。有了一个文件x.cpp,你可以使用

make x.e

请注意,-E 标志是在 CPPFLAGS 中定义的。这告诉编译器 (g++) 在预处理阶段之后停止。告诉编译器将-o生成的文件放在哪里,而 $@ 是 的make简写target,在这种情况下是.e文件。无需重定向任何东西;g++ 为您编写.e文件。

如果要为.ecpp 文件列表生成文件,请执行以下操作:

SRCS = a.cpp b.cpp c.cpp d.cpp
CPPS = $(SRCS:.cpp=.e)   

.PHONY:cpps
cpps: $(CPPS)   

然后构建它们:

make cpps
于 2012-05-21T01:53:04.490 回答
1

你不能使用-save-temps吗?如果您的项目有很多makefile,也许有一个顶层定义了编译器的名称/路径?我只是劫持它看起来像:

CC = 一些目标 gcc -save-temps

然后,您每次构建时都会得到一堆 .i 文件。

于 2013-04-19T15:44:49.380 回答