【问题标题】:Running preprocessor based on using make command or makefile基于使用 make 命令或 makefile 运行预处理器
【发布时间】:2012-05-20 10:23:16
【问题描述】:

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

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

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

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

有什么方法可以使用makefile 来运行C 预处理器吗?

【问题讨论】:

  • makefile 可以运行 g++-E,就像没有它运行它一样。只需复制您的正常编译规则,然后添加-E
  • 同意@ugoren,您需要解释为什么这只是对 .cpp 文件的现有编译规则的微小更改。
  • @OliCharlesworth,我想对几个单独的文件执行此操作,并将其输出一个一个地重定向到另一个文件。此外,我需要编辑每个 makefile 吗?
  • 然后复制您现有的规则,并为该特定文件制定特殊规则(但添加-E 等)。我不知道您所说的“每个makefile”是什么意思-您需要根据需要编辑尽可能多的makefile!
  • 作为 X11 构建系统一部分的 imake 程序使用 C 预处理器将 Imakefile 转换为 makefile。然而,这是一个进化的死胡同。我什至不确定 X11 是否还在使用它。

标签: c++ c gcc makefile c-preprocessor


【解决方案1】:

对预处理文件使用后缀 .cpp 是个坏主意,因为它与 C++ 文件的后缀 .cpp 冲突。尝试其他方法 - 这里有一个可以使用后缀 .e 的 sn-p:

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 文件。使用x.cpp 文件,您可以使用

make x.e

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

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

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

.PHONY:cpps
cpps: $(CPPS)   

然后构建它们:

make cpps

【讨论】:

  • CC 通常用于 C 编译器;用于 C++ 编译器的 CXX?
  • 你的意思是,我需要输入-E 选项并重定向到同名的“.e”文件?不过,我在您的回答中没有看到 -E 选项。我应该对单个文件逐一运行make x.cppmake x.e 吗?
【解决方案2】:

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

CC = some-target-gcc -save-temps

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多