我想编译许多源文件来组装它们但不链接它们 我使用类似下面的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(迭代)。
答案 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)