makefile,它还获取文件的名称

makefile,它还获取文件的名称,makefile,Makefile,我需要一个makefile,它还可以获取编译文件的名称 例如: make foo and the makefile should compile foo.c to foo. 这是我的makefile。如何改变它 all: out out: out.o gcc -g -m32 -Wall -o out out.o out.o: out.c gcc -m32 -g -Wall -ansi -c -o out.o out.c .PHONY: clean #Clean the bu

我需要一个makefile,它还可以获取编译文件的名称 例如:

make foo

and the makefile should compile foo.c to foo. 
这是我的makefile。如何改变它

all: out

out: out.o 
gcc -g  -m32 -Wall -o out out.o

out.o: out.c
gcc -m32 -g  -Wall -ansi -c -o out.o out.c


.PHONY: clean

#Clean the build directory
clean: 
rm -f *.o out

没有直接的方法可以将参数传递给Makefile,但是可以利用变量来实现所需的功能。检查对下面的Makefile所做的修改

NAME?=out#如果不传递任何参数,则生成的默认二进制文件为out

${NAME}:${NAME}.o

gcc -g  -m32 -Wall -o ${NAME} ${NAME}.o
${NAME}.o:${NAME}.c

gcc -m32 -g  -Wall -ansi -c -o ${NAME}.o out.c
.PHONY:clean

#清理生成目录

clean:

`rm -f *.o ${NAME}`
您应该通过键入

$make NAME=foo

$make clean NAME=foo

直接向make传递参数非常简单

您当前的makefile可以通过
makefoo
调用,并将编译
foo.c
以生成
foo
,因为make具有处理类似
foo.c=>foo
的情况的隐式规则;即使“foo”不是任何规则的目标,也不会有错误。(至少,GNU Make 3.81就是这种情况,我正在使用它。)

如果您想控制编译器和标志的选择(如
out
规则),可以使用多种方法。最简单的(虽然严格来说不是最好的)是修改makefile中的两个变量:

CC = gcc
CFLAGS = -g -m32 -Wall -ansi
另一个选项是使用您自己的模式规则覆盖隐式规则:

%: %.c
    gcc -g -m32 -Wall -ansi -o $@ $<

一旦你掌握了基础知识,就有可能进行进一步的改进。

应该是这样。你几乎同时发布了两条相互矛盾的评论。你还需要帮助吗?我认为这很有效…但不是。。一些想法?如果你给出了
make foo
,那么会返回一个错误,比如
no rule to target foo
(这里foo不在目标列表中)谢谢你,但我认为有一种方法可以做到这一点,因为这是我作业中的要求。有人知道怎么做吗?你用的是什么版本的Make??
%: %.o
    gcc -g -m32 -Wall -o $@ $^

%.o: %.c
    gcc -m32 -g  -Wall -ansi -c -o $@ $<

%: %.c