OSX Mavericks导致"生成多个输出文件时无法指定-o"

use*_*467 6 c macos gcc makefile

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

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

makefile是:

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)
Run Code Online (Sandbox Code Playgroud)
  • gcc被重定向到clang,但我不知道这是否会导致所描述的错误.
  • gcc已安装
  • 我不知道如何取消此重定向再次测试.
  • 我看到这篇文章:Makefile; gcc不工作?相信小牛队有责任,但我真的不明白这个问题及其解决方法

感谢您的关注

Eri*_*hil 11

$(LIB)从线上删除:

$(EXEC): $(OBJ) $(LIB)
Run Code Online (Sandbox Code Playgroud)

方式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文件,因此它将知道它将多个对象链接到一个可执行文件中,并且不会尝试编译源文件.