在 GCC 中,我们可以运行简单的预处理器:
g++ -E x.cpp > temp.cpp
但是,在有这么多makefile
s 的大型项目中;提到所有的依赖关系非常麻烦。例如
g++ -I /home/x1 -I /home/x2 ... -DMACRO1 -DMACRO2 ... -E x.cpp > temp.cpp
有什么方法可以通过使用makefile
,我们可以运行 C 预处理器?
在 GCC 中,我们可以运行简单的预处理器:
g++ -E x.cpp > temp.cpp
但是,在有这么多makefile
s 的大型项目中;提到所有的依赖关系非常麻烦。例如
g++ -I /home/x1 -I /home/x2 ... -DMACRO1 -DMACRO2 ... -E x.cpp > temp.cpp
有什么方法可以通过使用makefile
,我们可以运行 C 预处理器?
使用.cpp
预处理文件的后缀是一个坏主意,因为它与.cpp
C++ 文件的后缀冲突。试试别的 - 这是一个你可以开始使用后缀的片段.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
文件。
如果要为.e
cpp 文件列表生成文件,请执行以下操作:
SRCS = a.cpp b.cpp c.cpp d.cpp
CPPS = $(SRCS:.cpp=.e)
.PHONY:cpps
cpps: $(CPPS)
然后构建它们:
make cpps
你不能使用-save-temps吗?如果您的项目有很多makefile,也许有一个顶层定义了编译器的名称/路径?我只是劫持它看起来像:
CC = 一些目标 gcc -save-temps
然后,您每次构建时都会得到一堆 .i 文件。