在GCC中,我们可以运行简单的预处理器:
g++ -E x.cpp > temp.cpp
但是,在有这么多makefile的大型项目中;提到所有的依赖项是非常麻烦的。
makefile
g++ -I /home/x1 -I /home/x2 ... -DMACRO1 -DMACRO2 ... -E x.cpp > temp.cpp
有没有什么方法可以使用makefile来运行C预处理器?
deikduxw1#
你不能使用-save-temps吗?如果你的项目有很多makefile,也许有一个顶级的makefile定义了编译器的名称/路径?我只是劫持它看起来像:
-save-temps
CC = some-target-gcc -save-temps
这样,每次构建时,最终都会得到一堆.i文件。
.i
vhmi4jdf2#
在预处理文件中使用后缀.cpp是一个坏主意,因为它与C++文件的后缀.cpp冲突。尝试其他方法-这里有一个使用后缀.e的代码片段:
.cpp
.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如何从.cpp文件构建.e文件。
make
make x.e
注意-E标志是在CPPFLAGS中定义的,它告诉编译器(g++)在预处理阶段结束后停止,-o告诉编译器把生成的文件放在哪里,而$@是make对target的简写,在本例中是.e文件,不需要重定向任何东西;g++为您写入.e文件。如果要为cpp文件列表生成.e文件,请执行以下操作:
-o
target
SRCS = a.cpp b.cpp c.cpp d.cpp CPPS = $(SRCS:.cpp=.e) .PHONY:cpps cpps: $(CPPS)
然后构建它们:
make cpps
2条答案
按热度按时间deikduxw1#
你不能使用
-save-temps
吗?如果你的项目有很多makefile,也许有一个顶级的makefile定义了编译器的名称/路径?我只是劫持它看起来像:这样,每次构建时,最终都会得到一堆
.i
文件。vhmi4jdf2#
在预处理文件中使用后缀
.cpp
是一个坏主意,因为它与C++文件的后缀.cpp
冲突。尝试其他方法-这里有一个使用后缀.e
的代码片段:注意在“recipe”的开头放一个TAB(行“$(CXX)$(CFLAGS)...”)。上面的内容定义了一个规则,告诉
make
如何从.cpp
文件构建.e
文件。注意-E标志是在CPPFLAGS中定义的,它告诉编译器(g++)在预处理阶段结束后停止,
-o
告诉编译器把生成的文件放在哪里,而$@是make
对target
的简写,在本例中是.e
文件,不需要重定向任何东西;g++为您写入.e
文件。如果要为cpp文件列表生成
.e
文件,请执行以下操作:然后构建它们: