C makefile替换未按预期工作

C makefile替换未按预期工作,c,makefile,substitution,C,Makefile,Substitution,我有以下生成文件: 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_文件\u CLNT都是.O文件。但可悲的是,结果是: add_clnt.c, add_client.c, initfunction.c, add_xdr.o 因此,只有最后一个文件是.o

我有以下生成文件:

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_文件\u CLNT
都是.O文件。但可悲的是,结果是:

add_clnt.c, add_client.c, initfunction.c, add_xdr.o
因此,只有最后一个文件是.o文件。我直接从一个示例makefile中获取了这个示例。 有人能解释一下,为什么所有的
O\u文件\u CLNT
都不是.O文件


Gruß,Andre

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

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

应该可以使用。

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

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

应该可以使用。

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

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

应该可以使用。

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

C_FILES_CLNT = add_clnt.c add_client.c initfunction.c add_xdr.c
应该能让它起作用。

补充上述答案

因此只有最后一个文件是.o文件

这是因为只有最后一个文件名具有扩展名
.c
其余文件被视为
.c,
扩展名,这就是规则
%不采用这些文件的原因。c=%.o

您可以尝试一下makefile是如何工作的,例如将
O_文件\u CLNT=$(C_文件\u CLNT:%.C=%.O)
更改为
O_文件\u CLNT=$(C_文件\u CLNT:%.C,=%.O)
(观察
%C,
中的
)然后所有文件名都将转换为
.O
,最后一个除外:p

结论:Makefile将空格视为分词符,而不是逗号。同样的规则也适用于编译器,在编译器中,我们给出由空格操作的标志。

添加到上述答案中

因此只有最后一个文件是.o文件

这是因为只有最后一个文件名具有扩展名
.c
其余文件被视为
.c,
扩展名,这就是规则
%不采用这些文件的原因。c=%.o

您可以尝试一下makefile是如何工作的,例如将
O_文件\u CLNT=$(C_文件\u CLNT:%.C=%.O)
更改为
O_文件\u CLNT=$(C_文件\u CLNT:%.C,=%.O)
(观察
%C,
中的
)然后所有文件名都将转换为
.O
,最后一个除外:p

结论:Makefile将空格视为分词符,而不是逗号。同样的规则也适用于编译器,在编译器中,我们给出由空格操作的标志。

添加到上述答案中

因此只有最后一个文件是.o文件

这是因为只有最后一个文件名具有扩展名
.c
其余文件被视为
.c,
扩展名,这就是规则
%不采用这些文件的原因。c=%.o

您可以尝试一下makefile是如何工作的,例如将
O_文件\u CLNT=$(C_文件\u CLNT:%.C=%.O)
更改为
O_文件\u CLNT=$(C_文件\u CLNT:%.C,=%.O)
(观察
%C,
中的
)然后所有文件名都将转换为
.O
,最后一个除外:p

结论:Makefile将空格视为分词符,而不是逗号。同样的规则也适用于编译器,在编译器中,我们给出由空格操作的标志。

添加到上述答案中

因此只有最后一个文件是.o文件

这是因为只有最后一个文件名具有扩展名
.c
其余文件被视为
.c,
扩展名,这就是规则
%不采用这些文件的原因。c=%.o

您可以尝试一下makefile是如何工作的,例如将
O_文件\u CLNT=$(C_文件\u CLNT:%.C=%.O)
更改为
O_文件\u CLNT=$(C_文件\u CLNT:%.C,=%.O)
(观察
%C,
中的
)然后所有文件名都将转换为
.O
,最后一个除外:p


结论:Makefile将空格视为分词符,而不是逗号。同样的规则也适用于编译器,在编译器中,我们使用空格指定标志。

Np,请确保接受答案:)我编辑它以指定单词分隔符。Np,请确保接受答案:)我编辑它以指定单词分隔符。Np,请确保接受答案:)我编辑它以指定单词分隔符。Np,请确保接受答案:)我已将其编辑为指定单词分隔符。