由于我在我的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)
感谢您的关注
答案 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
文件,因此它会知道它将多个对象链接到一个可执行文件中,并且不会尝试编译源文件。