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

时间:2013-11-11 18:32:50

标签: 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)

感谢您的关注

1 个答案:

答案 0 :(得分: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文件,因此它会知道它将多个对象链接到一个可执行文件中,并且不会尝试编译源文件。