使用 g++ 通过一个命令预处理多个源文件

Preprocessing multiple source files with one command using g++

问题

我当前的工作目录中有三个文件:

我只想 预处理hello.cppgoodbye.cpp 并将输出转储到文件hello.igoodbye.i 中。有没有办法在 Ubuntu Linux 命令行 中使用 g++ 使用一个命令 来实现此目的?我只想调用 g++ 一次的原因是因为我最终想将此命令包含在我自己的 Makefile 中。

我试过的

我基本上做了以下事情:

g++ -E -o goodbye.i hello.i goodbye.cpp hello.cpp

不出所料,失败并出现以下错误:

g++ : fatal error: cannot specify '-o' with '-c', '-S' or '-E' with multiple files compilation terminated

我也试过g++ -E goodbye.cpp hello.cpp,这只是提醒我预处理器默认转储到标准输出。出于本练习的目的,我确实需要 g++ 将结果转储到实际的 *.i 文件中...

我要避免的事情

从评论来看,我觉得我可以提供进一步的说明。我试图避免在我的 Makefile 中有多个命令,因为每个单独的 .cpp 文件都会生成一个单独的命令:

all: preprocess_hello preprocess_goodbye

preprocess_hello:
    g++ -E -o hello.i hello.cpp

preprocess_hello:
    g++ -E -o goodbye.i goodbye.cpp

显然,这并不理想,因为我添加的每个新文件都需要添加新命令并更新 all 目标。

您可以使用 pattern rule 让 Make 知道如何从 .c 文件生成 .i 文件:

%.i: %.cpp
    g++ -E -o $@ $<

然后如果您的 makefile 需要 hello.i,Make 将知道它可以使用命令 g++ -E -o hello.i hello.cpp

例如如果你有 all: hello.i goodbye.i 和 运行 make all 它会知道它需要 hello.i 和 goodbye.i 并且它会制造它们。


如果您有一个 .cpp 文件列表并且您需要将其转换为一个 .i 文件列表(例如,如果您想这样做 all: $(CPPFILES) 但它不起作用,因为这些是 . cpp 文件而不是 .i 文件)你可以使用 patsubst:

all: $(patsubst %.cpp,%.i,$(CPPFILES))

您甚至可以使用 wildcard 来获取 cpp 文件列表。要使 all 依赖于当前目录中所有 .cpp 文件的所有 .i 文件,您可以使用

all: $(patsubst %.cpp,%.i,$(wildcard *.cpp))