我需要一个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
答案 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
一旦掌握了基础知识,就可以进一步完善。