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
相关产品推荐
相关产品推荐

