0

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

make foo

and the makefile should compile foo.c to foo. 

这是我的生成文件。如何改变它?

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
4

2 回答 2

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

于 2013-02-28T05:27:43.813 回答
1

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

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

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

于 2013-03-03T01:42:10.370 回答