【问题标题】:OSX Mavericks causes "cannot specify -o when generating multiple output files"OSX Mavericks 导致“生成多个输出文件时无法指定 -o”
【发布时间】:2013-11-11 18:32:50
【问题描述】:

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

**clang: error: 在生成多个输出文件时不能指定-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)

感谢您的关注

【问题讨论】:

  • 您能否包含make 的完整输出,而不仅仅是错误消息?
  • 很遗憾,我会,但我不能(因为我公司的这项工作是保密的)。

标签: c macos gcc makefile


【解决方案1】:

从行中删除$(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 文件,因此它会知道它正在将多个对象链接到一个可执行文件中,并且不会尝试编译源文件。

【讨论】:

  • 好的,感谢您的详细解释(以及您浪费的时间!)。然而,我做到了,我得到了在 Maverick 之前没有的新错误(关于一些内部链接)。我正在尝试解决它们;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多