makefile替换不像预期的那样工作

时间:2015-02-12 11:28:10

标签: c makefile substitution

我有以下makefile:

C_FILES_CLNT = add_clnt.c, add_client.c, initfunction.c, add_xdr.c
O_FILES_CLNT = $(C_FILES_CLNT:%.c=%.o)

all:
    echo $(O_FILES_CLNT)

我希望所有O_FILE_CLNT都是.o-Files。但遗憾的是输出结果是:

add_clnt.c, add_client.c, initfunction.c, add_xdr.o

因此只有最后一个文件是.o-File。我直接从example-makefile中取出了这个例子。 有人可以解释一下,为什么所有O_FILE_CLNT都不是.o-Files?

Gruß,Andre

2 个答案:

答案 0 :(得分:2)

单词分隔符不是逗号,,而是空格。所以将第一个变量改为:

C_FILES_CLNT = add_clnt.c add_client.c initfunction.c add_xdr.c

应该让它发挥作用。

答案 1 :(得分:1)

添加到上面的答案

so only the last file is a .o-File

因为只有上一个文件名的扩展名为.c,所以其他文件都被视为.c,扩展名,这就是规则%.c=%.o

未采用的原因

您可以试验看看makefile是如何工作的,例如将O_FILES_CLNT = $(C_FILES_CLNT:%.c=%.o)更改为O_FILES_CLNT = $(C_FILES_CLNT:%.c,=%.o)(在,中观察%c,)然后将转换所有文件名至.o除了最后一个:P

结论:Makefile将空格视为单词分隔符而不是逗号。同样的规则也适用于编译器,我们给出了用空格表示的标志。