编写Makefile调用PRIMME与SLEPc库报错:clean目标重复定义
解决Makefile中clean目标冲突的问题
问题原因
报错Makefile:36: *** target file 'clean' has both : and :: entries. Stop.的核心原因是:你引入的slepc_common配置文件里已经定义了clean::双冒号规则,而自己的Makefile中又写了clean:单冒号规则,Make不允许同一个目标同时存在单冒号和双冒号的规则定义。
解决方案
直接把自己的clean规则改成双冒号格式,就能和slepc_common里的规则合并执行,不会冲突。
修改后的完整Makefile
# Compiler CC = gcc # Directories SLEPC_DIR = /home/student/Documents/projet/codeProjet17SLEPc/CodePub/slepc-3.20.1 PRIMME_DIR = /home/student/Documents/projet/codeProjet17SLEPc/CodePub/primme # SLEPc settings include ${SLEPC_DIR}/lib/slepc/conf/slepc_common # PRIMME settings PRIMME_LIB = -L${PRIMME_DIR} -lprimme PRIMME_INC = -I${PRIMME_DIR}/PRIMMESRC/COMMONSRC # Compiler flags CFLAGS = -g -Wall $(SLEPC_CCFLAGS) $(PRIMME_INC) # Linker flags LDFLAGS = $(SLEPC_EPS_LIB) $(PRIMME_LIB) -lm -lblas -llapack # Targets TARGET = executable SOURCES = main.c prob.c time.c interface_primme.c graph.c res.c temp.c diff.c OBJECTS = $(SOURCES:.c=.o) # Build rules all: $(TARGET) $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ clean:: rm -f $(OBJECTS) $(TARGET)
关键修改点
- 将
clean:改为clean::,匹配slepc_common中的规则格式,解决冲突 - 把
PRIMME_INC合并到CFLAGS中,简化编译命令 - 将
PRIMME_LIB移到LDFLAGS里,统一管理链接参数 - 移除重复的
SLEPC_INC,因为slepc_common已经通过SLEPC_CCFLAGS包含了必要的头文件路径
内容的提问来源于stack exchange,提问作者Wiki
相关产品推荐
相关产品推荐

