使用 g++ 通过一个命令预处理多个源文件
Preprocessing multiple source files with one command using g++
问题
我当前的工作目录中有三个文件:
hello.cpp
goodbye.cpp
prog.cpp
我只想 预处理hello.cpp
和goodbye.cpp
并将输出转储到文件hello.i
和goodbye.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))
问题
我当前的工作目录中有三个文件:
hello.cpp
goodbye.cpp
prog.cpp
我只想 预处理hello.cpp
和goodbye.cpp
并将输出转储到文件hello.i
和goodbye.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))