$(dir NAMES…)

本文介绍了一个实用的函数——取目录函数(dir),该函数用于从文件名序列中提取每个文件所在的目录部分。当文件名中不包含目录路径时,默认返回当前目录。通过具体示例展示了如何使用此函数。

函数名称:取目录函数—dir

函数功能:从文件名序列“NAMES…”中取出各个文件名的目录部分。文件名的目录部分就是包含在文件名中的最后一个斜线(“/”)(包括斜线)之前的部分。

返回值:空格分割的文件名序列“NAMES…”中每一个文件的目录部分。

函数说明:如果文件名中没有斜线,认为此文件为当前目录(“./”)下的文件。

示例:

$(dir src/foo.c hacks)

返回值为“src/ ./”。

### Makefile 链接规则 `$(BIN_DIR)/%: $(BUILD_DIR)/%.o | $(BIN_DIR)` 的问题与修正 该规则试图通过通配符 `%` 定义一个通用的链接规则,将 `$(BUILD_DIR)` 中的 `.o` 文件链接为 `$(BIN_DIR)` 下的可执行文件。然而,这种写法在 GNU Make 的语法中属于混合使用了显式目标模式与隐式规则,已被标记为过时语法,提示 `mixed implicit and normal rules: deprecated syntax` [^1]。 该规则的语义是: - 所有位于 `$(BIN_DIR)` 下的目标(如 `bin/app`)都依赖于 `$(BUILD_DIR)` 中对应的 `.o` 文件(如 `build/app.o`); - 使用 `$(CC) -o $@ $<` 命令进行链接操作。 问题在于 GNU Make 对 **模式规则** 和 **静态模式规则** 有明确区分: - **模式规则** 使用 `%.o: %.c` 的形式,适用于通配符匹配; - **静态模式规则** 则使用 `targets: target-pattern: prereq-patterns ...` 的形式,需明确列出目标列表。 上述写法试图结合两者特性,但不符合 GNU Make 的语法规则,因此触发警告。 --- ### 修正方式:使用静态模式规则 推荐将该规则改写为 **静态模式规则**,以明确目标匹配方式和依赖关系。例如: ```makefile $(BIN_DIR)/app1 $(BIN_DIR)/app2: $(BIN_DIR)/%: $(BUILD_DIR)/%.o | $(BIN_DIR) $(CC) -o $@ $< ``` 其中,`$(BIN_DIR)/app1 $(BIN_DIR)/app2` 是显式列出的目标列表,`$(BUILD_DIR)/%.o` 是目标模式,`$(CC) -o $@ $<` 是链接命令。这种写法符合 GNU Make 的静态模式规则语法,避免了混合规则带来的问题 。 --- ### 替代方案:使用变量生成多个目标 若目标数量较多,可以使用变量定义目标列表,并结合 `addprefix` 和 `addsuffix` 生成目标路径,例如: ```makefile BINS := app1 app2 app3 BIN_TARGETS := $(addprefix $(BIN_DIR)/, $(BINS)) all: $(BIN_TARGETS) $(BIN_TARGETS): $(BIN_DIR)/%: $(BUILD_DIR)/%.o | $(BIN_DIR) $(CC) -o $@ $< ``` 此方式通过变量展开生成目标列表,保持规则清晰且符合 GNU Make 的推荐写法 。 --- ### 其他注意事项 - 确保 `$(BIN_DIR)` 存在,规则中使用了 `| $(BIN_DIR)` 表示该目录为订单只依赖(order-only dependency),即构建前确保目录存在; - 若 `$(CC)` 未定义,应确保在 Makefile 中设置正确的编译器路径; - 如果链接过程中涉及多个 `.o` 文件,应将所有目标文件列在命令中,或使用变量统一管理。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值