You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetBSD下简单Makefile遇问题:SRCS为空致编译失败求助

问题:NetBSD下Makefile中$(SRCS)为空导致编译失败

我正在NetBSD环境中编写一个简单的Makefile,内容如下:

CC = gcc
TARGET = target

CFLAGS = -O3 -Wall -Wextra -pedantic

SRCS = $(shell find . -type f -name '*.c')
OBJS = $(patsubst %.c,%.o,$(SRCS))

.PHONY: all clean

all: $(TARGET)

$(OBJS): $(SRCS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJS)

$(TARGET): $(OBJS)
    $(CC) $(OBJS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

执行后出现如下错误输出:

gcc  -o target
gcc: fatal error: no input files
compilation terminated.
*** Error code 1

我发现$(SRCS)变量为空,但直接在shell中执行find . -type f -name '*.c'命令时,能正常找到所需的.c文件。请问哪里出错了?


解决方法

核心原因

NetBSD默认使用的是BSD make,而$(shell ...)是GNU make(gmake)独有的语法,BSD make不识别该语法,导致SRCS变量被赋值为空,最终编译时因无输入文件报错。

两种修复方案

方案1:使用GNU make执行

NetBSD软件仓库提供了GNU make包,先安装它:

pkgin install gmake

之后用gmake替代默认的make命令执行编译:

gmake

原Makefile的语法即可正常工作。

方案2:修改Makefile适配BSD make

调整语法兼容BSD make,同时修复原Makefile的依赖逻辑问题:

CC = gcc
TARGET = target

CFLAGS = -O3 -Wall -Wextra -pedantic

# BSD make用!=执行shell命令,替代GNU make的$(shell)
SRCS!= find . -type f -name '*.c'
OBJS = ${SRCS:.c=.o}

.PHONY: all clean

all: $(TARGET)

# 用模式规则替代原错误依赖,每个.o仅依赖对应的.c
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJS)

$(TARGET): $(OBJS)
    $(CC) $(OBJS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

修改要点:

  • 用!=替代=执行shell命令,这是BSD make获取命令输出的标准语法
  • 用${SRCS:.c=.o}替代$(patsubst %.c,%.o,$(SRCS)),两种语法BSD make均支持,前者更简洁
  • 将原$(OBJS): $(SRCS)规则改为模式规则%.o: %.c,避免每个.o依赖所有.c文件的冗余编译

内容的提问来源于stack exchange,提问作者kamkow1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:47:16