编写makefile,将多个.c文件编译为静态库,再使用静态库将usr.c编译为usr
时间: 2024-03-15 16:45:04 浏览: 15
假设需要编译的源文件有a.c、b.c、c.c和usr.c,可以按照以下方式编写Makefile:
```
CC = gcc
CFLAGS = -Wall -g -fPIC
# 目标文件
OBJS = a.o b.o c.o
all: libmylib.a usr
# 编译静态库
libmylib.a: $(OBJS)
ar rcs $@ $^
# 编译可执行文件
usr: usr.c libmylib.a
$(CC) $(CFLAGS) -o $@ $< -L. -lmylib
# 编译目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o *.a usr
.PHONY: all clean
```
上述Makefile包含了三个目标:all、libmylib.a和usr。其中,all是默认目标,执行make命令时会自动执行它。libmylib.a是用来编译静态库的目标,usr是用来编译可执行文件的目标。
在编译静态库时,Makefile首先会将a.o、b.o和c.o三个目标文件打包成静态库libmylib.a。在编译可执行文件时,Makefile会将usr.c和静态库libmylib.a链接起来,生成可执行文件usr。
需要注意的是,在编译usr时需要使用-L参数指定静态库libmylib.a的路径,-l参数指定静态库名称,不需要加上前缀"lib"和后缀".a"。
此外,Makefile中还包含了一个通配符规则,用来编译所有的.c源文件。例如,当Makefile需要编译a.o时,它会根据通配符规则自动执行以下命令:
```
gcc -Wall -g -fPIC -c a.c -o a.o
```
这样就能够自动编译所有的源文件了。