clang错误:生成多个输出文件时无法指定-o

问题描述 投票:0回答:1

我今年有一个 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,但我不知道如何修复它。

makefile clang
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.