【问题标题】:makefile - how to exclude file extension suffix from a variablemakefile - 如何从变量中排除文件扩展名后缀
【发布时间】:2015-02-19 21:30:46
【问题描述】:

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

使 ARGS="out.c"

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

在这个例子中: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

【问题讨论】:

  • 您的问题不清楚。你究竟是如何调用make,你想让它做什么?
  • 您确定要将目标文件命名为output.o吗?
  • 在哪个操作系统上?如果在 Linux 上,clean 目标 rm 命令的反斜杠是错误的!
  • 为什么clean 规则会尝试删除Task1,这是一个从未构建过的文件?
  • 我真的很惊讶人们花更多的时间在这里提出错误的问题(并等待答案)而不是阅读文档。

标签: c makefile


【解决方案1】:

按照您的要求进行操作的粗略方法很简单:

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 $@ $^ 

【讨论】:

    【解决方案2】:

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

    我无法提出改进建议,因为你想做什么和发生什么都不清楚。

    顺便说一句,使用remake(如remake -x)或至少make --trace(使用最新的GNU make 4.x)来了解make在做什么以及为什么。

    另外,你会发现几个Makefile-s 的例子:here & there 等等...不要忘记make 有许多内置规则,您可以通过运行make -p 来获得它们

    阅读 GNU make 的 documentation 和一些教程,以及 Makefile-s 的一些示例,您不会浪费时间。

    【讨论】:

    • 您好,感谢您的帮助。我想创建一个用于编译 c 的 makefile 有 2 个要求: 1. makefile 从命令行接收它的文件名 2. makefile 创建的可执行文件应该具有相同的名称,没有后缀。我愿意接受任何改进。但是,我还没有看到更好的方法来为我的要求创建 makefile
    • 我的建议是花一个小时阅读文档和示例。它比在论坛上等待答案更快,而且您会学到更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多