makefile - 如何从变量中排除文件扩展名后缀

时间:2015-02-19 21:30:46

标签: c makefile

下一个makefile从其命令行arg -ARGS接收要编译的文件。例如

使ARGS =“out.c”

我想用变量ARGS替换创建的可执行文件“run”的名称,不包括后缀

在这个例子中是

:run =“out”

all: Task1
Task1: outputs/output.o
	gcc -g -m32 -Wall -o run outputs/output.o 

outputs/output.o: outputs/${ARGS}
	gcc -m32 -g -w -Wall -ansi -c -o outputs/output.o outputs/${ARGS} 


.PHONY: clean
run: clean Task1
clean:
	rm -f outputs\output.o Task1

2 个答案:

答案 0 :(得分:2)

做你要求的粗暴方式就是:

EXEC := $(basename $(ARGS))
all: Task1
Task1: outputs/output.o
    gcc -g -m32 -Wall -o $(EXEC) outputs/output.o 

更好的方法是:

EXEC := $(basename $(ARGS))
all: $(EXEC)
$(EXEC): outputs/output.o
    gcc -g -m32 -Wall -o $(EXEC) outputs/output.o 

更好的是:

EXEC := $(basename $(ARGS))
all: $(EXEC)
$(EXEC): outputs/output.o
    gcc -g -m32 -Wall -o $@ $^ 

答案 1 :(得分:1)

如果使用GNU make,您需要basename功能,可能需要$(basename $(AUX))。也许像$(*F)这样的变量也可能有用(请阅读文档)。但是,您的Makefile可能不对。

我不能提出改进建议,因为你想要做和将要发生的事情尚不清楚。

BTW,使用remake(作为remake -x)或至少make --trace(最近有足够的GNU make 4.x)来了解make正在做什么以及为什么

此外,您还会找到Makefile - s的几个例子:here& there 等等......别忘了make有很多内置规则,你可以通过make -p

来获取它们

通过阅读documentation GNU make,以及一些教程和Makefile - s的一些示例