我今年有一个 C 项目,我们的老师给了我们一部分代码来指导我们。
我尝试通过在终端中输入 make 来生成项目的可执行文件,但它一直给出相同的错误:
cc -g -Wall main.c prob.o time.o interface_primme.o prob.h time.h interface_primme.h -o main -L./primme/ -lprimme -lm -lblas -llapack
clang:错误:生成多个输出文件时无法指定-o make: *** [主要] 错误 1
Makefile 是:
# librairies de PRIMME
LIBP = -L./primme/ -lprimme
# includes de PRIMME
INCP = -I./primme/PRIMMESRC/COMMONSRC/
# toutes les librairies
LIB = $(LIBP) -lm -lblas -llapack
COPT = -g -Wall
default: main
clean:
rm *.o
rm main
main: main.c prob.o time.o interface_primme.o prob.h time.h interface_primme.h
cc $(COPT) $^ -o $@ $(LIB)
%.o: %.c
cc $(COPT) -c $< -o $@ $(INCP)
我尝试单独生成不同的可执行文件,但它给出了相同的错误。所以我认为错误来自外部库 primme,但我不知道如何修复它。
main
的 Makefile 规则包括一个 .c
文件和一些 .o
文件。第一个文件需要首先编译为目标文件,但 .o
文件已经是并且可以链接到可执行文件中。这是 C 编译器在一条规则中的两个函数;甚至一条编译行。看起来 clang
实际上正在尝试这样做,但它随后会生成多个输出文件:来自 main.o
的 main.c
和来自 a.out
文件的 *.o
可执行文件。
将
main.c
更改为 main.o
,因为该文件已由其下面的规则创建。然后删除.h
文件;如果需要,这些可能可以包含在下面的规则中。
我的建议是在 Makefile 中使用以下内容:
main: main.o prob.o time.o interface_primme.o
cc $(COPT) $^ -o $@ $(LIB)
%.o: %.c prob.h time.h interface_primme.h
cc $(COPT) -c $< -o $@ $(INCP)