6

由于我在我的 mac 上安装了小牛,我无法编译我的一些程序。

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

生成文件是:

SHELL = /bin/sh
CC = gcc
CFLAGS = -Wall -O3 -funroll-all-loops
EXEC = program
SRC = $(EXEC).c file1.c file2.c file3.c file4.c
OBJ = $(SRC:.c=.o)
LIB = $(SRC:.c=.h)

all: $(EXEC)

$(EXEC): $(OBJ) $(LIB)
    $(CC) -o $@ $^ $(LDFLAGS) -lm

%.o: %.c $(LIB)
    $(CC) -o $@ -c $< $(CFLAGS)
  • gcc 被重定向到 clang,但我不知道这是否会导致所描述的错误。
  • gcc 已安装
  • 我不知道如何取消此重定向以再次测试。
  • 我看到了这篇文章:Makefile;gcc 不工作?相信小牛队有责任,但我并不真正了解问题及其解决方案

感谢您的关注

4

1 回答 1

11

从行中删除$(LIB)

$(EXEC): $(OBJ) $(LIB)

方式LIB已定义,它具有价值program.h file1.h file2.h file3.h file4.h。这有两个效果。

首先,它说$(EXEC),即program,取决于.h文件。但是,program直接取决于.o文件。program不直接使用.h其构建中的文件,因此依赖项program不应包含这些.h文件。

其次,$^命令中的 表示列出目标所依赖的所有文件。这会将所有.o.h文件传递给编译器。当编译器看到.h列出了几个文件时,它认为将编译几个源文件,因此将产生几个目标文件。

当您$(LIB)从此规则中的依赖项中删除时,.h文件将不会在命令中列出。然后编译器将只看到几个.o文件,因此它会知道它将几个对象链接到一个可执行文件中,并且不会尝试编译源文件。

于 2013-11-11T18:41:00.033 回答