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

sd2nnvve  于 2023-02-18  发布在  其他
关注(0)|答案(1)|浏览(164)

我写了一个Makefile来编译我的C源代码,并生成.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)

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

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

有人能帮助调试这个Makefile并找出它发生的原因吗?

db2dz4w8

db2dz4w81#

这个...

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

...错误。替换引用试图从以$(OBJ)/.o结尾的$(FWI_OBJ)转换文件名(展开后)以$(OBJ)/.d结尾$(FWI_OBJ)中的文件名都不是以这种方式结尾的,所以它们都是原封不动地通过的。结果,make尝试include.o文件,不是你想要的.d文件。
也许你指的是这个

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

相关问题