makefile也获取文件编译的名称

时间:2013-02-27 21:48:17

标签: 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 build directory
clean: 
rm -f *.o out

2 个答案:

答案 0 :(得分:1)

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

NAME ?=out #Default binary generated is out if you dont pass any argument

${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 the build directory

clean:

`rm -f *.o ${NAME}`

你应该输入

来调用Makefile

$ make NAME=foo

$ make clean NAME=foo

答案 1 :(得分:1)

直接将参数传递给Make非常简单。

您可以使用make foo调用当前的makefile,并编译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 $@ $<

如果您希望它在单独的步骤中构建foo.o,您必须将规则拆分为两个规则 - 并且还放入一个没有配方的规则来取消Make的隐式规则:

%: %.o
    gcc -g -m32 -Wall -o $@ $^

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

%: %.c

一旦掌握了基础知识,就可以进一步完善。