Makefile GNU make:如何防止'-包括file.ext';执行目标为';file.ext';?
仅回顾一下术语,这是makefile“规则”的结构:Makefile GNU make:如何防止'-包括file.ext';执行目标为';file.ext';?,makefile,gnu-make,Makefile,Gnu Make,仅回顾一下术语,这是makefile“规则”的结构: target: dependencies ... commands ... 这是我编写的makefile: CC = mpicc SHAREDLIB = libfmd.so CFLAGS = -fPIC -Wall -Wno-unused-result -O3 -fopenmp LFLAGS = -lm -fopenmp -lgsl -lgslcblas OBJS = $(patsubst %.
target: dependencies ...
commands
...
这是我编写的makefile:
CC = mpicc
SHAREDLIB = libfmd.so
CFLAGS = -fPIC -Wall -Wno-unused-result -O3 -fopenmp
LFLAGS = -lm -fopenmp -lgsl -lgslcblas
OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
.PHONY: all shared clean
all: shared
shared: $(SHAREDLIB)
$(SHAREDLIB): depend.mk $(OBJS)
$(CC) $(OBJS) -shared -o $@ $(LFLAGS)
depend.mk: *.c *.h
$(CC) -MM *.c > depend.mk
-include depend.mk
clean:
rm -f *.o libfmd.so depend.mk
当文件夹被清除时,我输入makeclean
,将显示以下行:
mpicc -MM *.c > depend.mk
rm -f *.o libfmd.so depend.mk
在我看来,-include depend.mk
除了包含depend.mk
之外,还执行了depend.mk
是其目标的规则。我想停止这种行为。你是对的。请参阅文档中的
无法防止这种行为:如果有规则创建包含的makefile,make将始终在其过期时重建它,然后重新调用自身以读取最新版本
问题是,你为什么要避免它?也许如果你能从更高的层次解释一下你真正想要的行为,我们会有所帮助。正如您在这里看到的那样,可以在不创建任何depend.mk文件的情况下创建.o文件,然后编译失败,您可以修改头文件以修复它,但由于重新运行时depend.mk文件不存在,因此无法正确重建源文件
如果您想通过GCC准确地处理C/C++依赖关系,您可以看看。您是对的。请参阅文档中的
无法防止这种行为:如果有规则创建包含的makefile,make将始终在其过期时重建它,然后重新调用自身以读取最新版本
问题是,你为什么要避免它?也许如果你能从更高的层次解释一下你真正想要的行为,我们会有所帮助。正如您在这里看到的那样,可以在不创建任何depend.mk文件的情况下创建.o文件,然后编译失败,您可以修改头文件以修复它,但由于重新运行时depend.mk文件不存在,因此无法正确重建源文件
如果您想用GCC准确地处理C/C++依赖关系,您可以看看
仅供参考,这是错误的,因为make不支持规则字符串中的shell通配符。尽管是在一个配方行上,当它被外壳本身扩展时可以工作
我想停止这种行为
depend.mk是默认目标的先决条件,因此它无论如何都是一个目标
此外,对于大型项目来说,depend.mk的预处理速度很慢,因此切换到手动编写的依赖项或使用@madscitificate建议的推荐方法生成依赖项是完全有意义的
仅供参考,这是错误的,因为make不支持规则字符串中的shell通配符。尽管是在一个配方行上,当它被外壳本身扩展时可以工作
我想停止这种行为
depend.mk是默认目标的先决条件,因此它无论如何都是一个目标
此外,对于大型项目来说,depend.mk的预处理速度很慢,因此切换到手动编写的依赖项,或者按照@madscitist的建议使用推荐的方法生成依赖项是完全有意义的。make不支持规则字符串中的shell通配符,这是不正确的:它说目标是文件名,用空格分隔。可以使用通配符,也可以使用由空格分隔的文件名组成的先决条件。(这里也允许使用通配符。)make不支持规则字符串中的shell通配符不是真的:表示目标是文件名,用空格分隔。可以使用通配符,也可以使用由空格分隔的文件名组成的先决条件。(此处也允许使用通配符。)
depend.mk: *.c *.h
$(CC) -MM *.c > depend.mk