多文件目标编译错误总结:
在一个目录下有两个文件:hello.c uart.c,编译这两个文件,把编译生成的文件输出到out目录下:
Makefile脚本为:
include $(TOPDIR)/config.mk
CFLAGS= -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g
SRCS :=$(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(wildcard *.c))
OBJS = $(addprefix $(OUTOBJ)/,$(patsubst %.c,%.o,$(wildcard *.c)))
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $(notdir $(patsubst %.o,%.c,$@))
clean:
rm -rf $(OBJS) $(OBJ)
.PHONY: all clean
#OBJ表示本目录下的目标文件
#OBJS表示把目标文件输出到out目录下:
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $^
$^ 代表所有的依赖,
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /work/zmOS/out/hello.o hello.c uart.c
arm-linux-gcc: cannot specify -o with -c or -S with multiple files
make[2]: *** [/work/zmOS/out/hello.o] 错误 1
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $<
依赖都是同一个 $<代表众多依赖中的第一个
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /work/zmOS/out/hello.o hello.c
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /work/zmOS/out/uart.o hello.c
display
/work/zmOS/out/hello.o /work/zmOS/out/uart.o
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $(notdir $(patsubst %.o,%.c,$@))
这样可以正常编译通过,但是后面依赖真是有点麻烦
make[2]: 正在进入目录 `/work/zmOS/drivers/uart'
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /wo rk/zmOS/out/hello.o hello.c
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /wo rk/zmOS/out/uart.o uart.c
display
/work/zmOS/out/hello.o /work/zmOS/out/uart.o
make[2]:正在离开目录 `/work/zmOS/drivers/uart'
在一个目录下有两个文件:hello.c uart.c,编译这两个文件,把编译生成的文件输出到out目录下:
Makefile脚本为:
include $(TOPDIR)/config.mk
CFLAGS= -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g
SRCS :=$(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(wildcard *.c))
OBJS = $(addprefix $(OUTOBJ)/,$(patsubst %.c,%.o,$(wildcard *.c)))
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $(notdir $(patsubst %.o,%.c,$@))
clean:
rm -rf $(OBJS) $(OBJ)
.PHONY: all clean
#OBJ表示本目录下的目标文件
#OBJS表示把目标文件输出到out目录下:
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $^
$^ 代表所有的依赖,
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /work/zmOS/out/hello.o hello.c uart.c
arm-linux-gcc: cannot specify -o with -c or -S with multiple files
make[2]: *** [/work/zmOS/out/hello.o] 错误 1
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $<
依赖都是同一个 $<代表众多依赖中的第一个
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /work/zmOS/out/hello.o hello.c
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /work/zmOS/out/uart.o hello.c
display
/work/zmOS/out/hello.o /work/zmOS/out/uart.o
all:$(OBJS)
$(OBJS):$(SRCS)
$(CC) $(CFLAGS) -c -o $@ $(notdir $(patsubst %.o,%.c,$@))
这样可以正常编译通过,但是后面依赖真是有点麻烦
make[2]: 正在进入目录 `/work/zmOS/drivers/uart'
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /wo rk/zmOS/out/hello.o hello.c
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o /wo rk/zmOS/out/uart.o uart.c
display
/work/zmOS/out/hello.o /work/zmOS/out/uart.o
make[2]:正在离开目录 `/work/zmOS/drivers/uart'
#OBJ表示本目录下的目标文件
all:$(OBJ)
%.o:%.c
@echo "$@,$<"
${CC} $(CFLAGS) -c -o $@ $<
mv $@ $(OUTOBJ)/
目标文件和依赖文件只能在同一目录,否则报错,找不到目标文件
hello.o,hello.c
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o hello.o hello.c
mv hello.o /work/zmOS/out/
uart.o,uart.c
arm-linux-gcc -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -pipe -g -c -o uart.o uart.c
mv uart.o /work/zmOS/out/