Gcc错误:无法使用多个文件指定-c和-o

时间:2016-01-20 10:49:55

标签: c gcc makefile

我想编译许多源文件来组装它们但不链接它们 我使用类似下面的makefile

sources = $(wildcard absolut_path_to_source_files/*.c)
objects = absolut_path_to_source_files_folder
compile = $(foreach p,$(sources), gcc -c $(p) -o $(objects)/$(patsubst %.c,%.o,$(notdir $(p)) ))
all:
     $(compile)

我收到一个gcc错误,即两个标志-c-o无法同时用于多个源文件,

    gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files
    compilation terminated.

这是我无法理解的,因为它在foreach函数中使用,该函数一次只调用一个源文件gcc(迭代)。

1 个答案:

答案 0 :(得分:2)

这是一个坏主意。基本上你的命令是无效的,因为它就像gcc -c file1.c -o foo/file1.o gcc -c file2.c -o foo/file2.o - shell无法知道第一个命令何时结束,第二个命令何时开始。如果你真的需要,可以将;添加到每个生成的编译命令的尾部,这样它们至少可以分开:

compile = $(foreach p,$(sources), gcc -c $(p) -o $(objects)/$(patsubst %.c,%.o,$(notdir $(p)));)

但是,你应该做的是例如:

BUILDDIR:=build
sources:=$(wildcard *.c)
objects:=$(addprefix $(BUILDDIR)/, $(patsubst %.c, %.o, $(sources)))

$(BUILDDIR)/%.o: %.c
    gcc -c $^ -o $@

all: $(objects)