如何在下面的makefile中具体实现A&B。:这个项目的程序员已经选择将他们的一些代码打包到一个名为chomp.adt的“模块”中,从这个模块中可以生成相关的文件cookie.h和cookie.cpp文件。生成此程序所需的步骤如下:
A.运行命令
csplit chomp.adt "/Split Here/"
并将生成的文件xx00复制到cookie.h。
B.运行命令
csplit chomp.adt "/Split Here/"
并将生成的文件xx01复制到cookie.cpp。
C.编译cookie.cpp生成cookie.o.
D.编译mainProg.cpp生成mainProg.o。
E.链接.o文件以生成一个名为playChomp的可执行程序
我如何编写一个makefile来执行所有这些步骤?我知道如何实现C-E,我相信,它主要是A和B,我对如何制定规则感到困惑。当我尝试的时候,我把A和B写成-
cookie.h: csplit chomp.adt
cp xx00 cookie.h
cookie.cpp: csplit chomp.adt
cp xx01 cookie.cpp
我收到错误消息,“cookie.cpp没有生成目标csplit所需的规则”。
发布于 2020-05-09 12:34:39
一个简单的makefile规则的语法是:
<target> : <prerequisites>
<recipe>
其中目标是要构建的输出文件,先决条件是用于构建目标的输入文件,配方是将输入文件转换为输出文件的过程。
命令csplit ...
是配方的一部分。它不应该被列为先决条件。
因此,您的规则应该如下所示:
cookie.h: chomp.adt
csplit $< "/Split Here/"
cp xx00 $@
cookie.cpp: chomp.adt
csplit $< "/Split Here/"
cp xx01 $@
你可以在这里读到关于$<
和$@
的内容:https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html没有必要严格地使用它们。
但是,上面的规则并不理想,因为您在不需要的时候运行了两次csplit命令。如果您尝试在启用并行构建的情况下运行make (make -jN
),它可能会失败,因为两者将同时运行并覆盖输出文件。
如何做得更好取决于您拥有哪个版本的GNU。如果你有GNU make 4.3,你可以使用:
cookie.h cookie.cpp &: chomp.adt
csplit $< "/Split Here/"
cp xx00 cookie.h
cp xx01 cookie.cpp
这是一个分组的目标,您可以在此处阅读:https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html#index-grouped-targets
如果您有一个较旧的版本,您可以使用一个技巧,即目标和先决条件都以相同的前缀(字母c
)开头;它将如下所示:
%ookie.h %ookie.cpp : %homp.adt
csplit $< "/Split Here/"
cp xx00 cookie.h
cp xx01 cookie.cpp
这是一个模式规则,你可以在这里阅读到:https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html
https://stackoverflow.com/questions/61691112
复制相似问题