如何在 Makefile 中使用变量列表作为目标?

发布于 2024-10-05 11:37:37 字数 519 浏览 3 评论 0原文

假设我正在编写一个 makefile,并且顶部有以下变量声明:

FILES = file1.cpp file2.cpp file3.cpp

现在假设我想使用特殊命令来编译每个变量,而不像这样指定每个目标:

file1.o : file1.cpp
    custom_command file1.cpp
file2.o : file2.cpp
    custom_command file2.cpp
file3.o : file3.cpp
    custom_command file3.cpp

有没有更好的方法使用 $(FILES) 我在上面声明的变量?

像这样的东西:

$(FILES:.cpp=.o) : $(FILES)
    custom_command $(FILES)

...只需对 $(FILES) 变量中的每个文件执行此操作。

Suppose I am working on a makefile and I have the following variable declaration at the top:

FILES = file1.cpp file2.cpp file3.cpp

Now suppose I want to compile each of those with a special command without specifying each target like this:

file1.o : file1.cpp
    custom_command file1.cpp
file2.o : file2.cpp
    custom_command file2.cpp
file3.o : file3.cpp
    custom_command file3.cpp

Is there a better way to do this using the $(FILES) variable I declared above?

Something like:

$(FILES:.cpp=.o) : $(FILES)
    custom_command $(FILES)

...only it needs to do this for each file in the $(FILES) variable.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

没有伤那来痛 2024-10-12 11:37:37

是的。有一些所谓的模式规则。一个例子是最容易理解的:(

%.o: %.cpp
       $(CC) -c $(CFLAGS) $(CPPFLAGS) 
lt; -o $@

请记住,Makefiles 需要选项卡)。该规则描述了如何从 cpp 文件创建目标文件。

如果您不需要如此广泛的规则,则可以使用所谓的静态模式:

objects = file1.o file2.o file3.o

all: $(objects)

$(objects): %.o: %.cpp
        $(CC) -c $(CFLAGS) $(CPPFLAGS) 
lt; -o $@

这是关于 静态模式规则模式规则

Yes. There are what are known as pattern rules. An example is the easiest to understand:

%.o: %.cpp
       $(CC) -c $(CFLAGS) $(CPPFLAGS) 
lt; -o $@

(remember that Makefiles require tabs). This rule describes how to make an object file from a cpp file.

If you do not want such a broad rule, you can use what are called static patterns:

objects = file1.o file2.o file3.o

all: $(objects)

$(objects): %.o: %.cpp
        $(CC) -c $(CFLAGS) $(CPPFLAGS) 
lt; -o $@

Here's the section on static pattern rules and pattern rules in the GNU Make manual.

不念旧人 2024-10-12 11:37:37

可以按照以下方式执行此操作:

SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)

$(OBJS): $(SRCS)
        cc -c -o a.o a.c
        cc -c -o b.o b.c

但您必须记住依赖项是完整的 - 它假设 ao 依赖于 bc 作为好吧,情况可能并非如此。

您可能需要的是关于如何将一种文件类型转换为另一种文件类型的单个规则:

SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)

all: $(OBJS)

.c.o:
        gcc -c -o $@ 
lt;

.co 就是这样一条规则,它规定了要运行哪些命令来转换 .c > 文件转换为 .o 文件。在实际命令中,$@ 替换为特定目标,$< 替换为第一个先决条件的名称。

您还可以使用许多其他自动变量,可以使用 info make 查找它们,或者如果您不会的话,可以查找一本关于 make 的好书拥有可用的info内容。

You can do that, as per the following:

SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)

$(OBJS): $(SRCS)
        cc -c -o a.o a.c
        cc -c -o b.o b.c

but you have to remember that the dependencies are complete - it assumes that a.o depends on b.c as well which is probably not the case.

What you're probably after is a single rule on how to turn one file type into another:

SRCS=a.c b.c
OBJS=$(SRCS:.c=.o)

all: $(OBJS)

.c.o:
        gcc -c -o $@ 
lt;

.c.o is such a rule which states what commands to run to turn a .c file into a .o file. In the actual command, $@ is replaced with the specific target and $< is replaced with the name of the first prerequisite.

There are many other automatic variables you can use, look them up with info make or look for a good book on make if you don't have the info stuff available.

涙—继续流 2024-10-12 11:37:37
SRCS = a.c b.c
OBJS = $(SRCS:.c=.o)

.c.o:
        ${CC} ${CFLAGS} -c -o $@ 
lt;

虽然 $< 不太可移植(IIRC,bsdmake 具有 $^ 的含义,并且 $< 完全交换为 gmake 使用的内容),这是 .co 的默认配方,在任一实现中都有效。

SRCS = a.c b.c
OBJS = $(SRCS:.c=.o)

.c.o:
        ${CC} ${CFLAGS} -c -o $@ 
lt;

Though $< isn't quite portable (IIRC, bsdmake has the meaning of $^ and $< exactly swapped to what gmake uses), this is the default recipe for .c.o that would be in effect in either implementation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文