Makefile:由于缺少分隔符错误,无法编译和链接

Makefile: fail to compile and link due to missing separator error

提问人:Leo 提问时间:2/16/2023 更新时间:2/16/2023 访问量:36

问:

我编写了一个 Makefile 来编译我的 C 源代码并生成 ,这些文件旨在存储在与源代码所在位置不同的另一个目录中。这是我的 Makefile 的副本:.o.d.c

SHELL=/bin/bash

EXEC=./bin
OBJ=./obj

CC=mpicc
CFLAGS=-O3 -Wall
LFLAGS=-lm -lstdc++ -lmpi


$(OBJ)/%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@
    $(CC) $(CFLAGS) -MM $*.c > $(OBJ)/$*.d


FWI_OBJ = $(FWI_SRC:%.c=$(OBJ)/%.o)

FWI_SRC = \
        testmpi.c \
        printneigh.c


fwi2D:      $(FWI_OBJ) fd.h
    $(CC) $(LFLAGS) $(FWI_OBJ) -o $(EXEC)/xtestmpi

all: fwi2D

.PHONY: clean
clean:
    rm -f $(OBJ)/*.o $(OBJ)/*.d $(EXEC)/*

install: clean all

-include $(FWI_OBJ:$(OBJ)/.o=$(OBJ)/.d)

之后,屏幕显示以下错误消息:make

obj/testmpi.o:1: warning: NUL character seen; rest of line ignored
obj/testmpi.o:1: *** missing separator.  Stop.

谁能帮忙调试这个 Makefile 并弄清楚它为什么会发生?

c makefile gnu-make 英特尔-MPI

评论

2赞 John Bollinger 2/16/2023
这个问题很容易让人想起昨天的这个问题。特别是,该问题的 OP 在评论中询问了该问题中出现的(错误)陈述形式。include

答:

1赞 John Bollinger 2/16/2023 #1

这。。。

-include $(FWI_OBJ:$(OBJ)/.o=$(OBJ)/.d)

...是错误的。替换引用尝试将文件名从该端的 (展开) 转换为以 (展开) 结尾。没有一个文件名以这种方式结束,因此它们都保持不变地传递。因此,尝试访问文件,而不是所需的文件。$(FWI_OBJ)$(OBJ)/.o$(OBJ)/.d$(FWI_OBJ)makeinclude.o.d

可能你的意思是这样的,相反:

-include $(FWI_OBJ:.o=.d)

评论

0赞 Thomas D. 2/16/2023
谢谢,布林@John。我尝试了你的策略,它奏效了。棒!