阶段 1.3: Make 实战(编译静态库 / 动态库 + 链接)
学习目标
- 掌握静态库(
.a)和动态库(.so)的编译 - 学会链接库(静态链接、动态链接)
- 理解库的搜索路径
核心知识点
- 静态库编译:
ar rcs libxxx.a obj1.o obj2.o(打包.o 文件为静态库) - 动态库编译:
gcc -fPIC -shared -o libxxx.so obj1.o obj2.o(生成位置无关的动态库) - 链接库:
gcc -o target src.o -L./ -lxxx(-L指定库路径,-l指定库名,省略lib和后缀)
实战练习
练习 5:编译静态库并链接
步骤 1:复用add.c、sub.c、calc.h,编写main.c(同上)。
步骤 2:编写Makefile
CC = gcc
CFLAGS = -Wall
TARGET = calc
# 库相关
LIB_NAME = calc
LIB_DIR = ./ # 库路径
STATIC_LIB = lib$(LIB_NAME).a
# 源文件
LIB_SRCS = add.c sub.c
LIB_OBJS = $(patsubst %.c, %.o, $(LIB_SRCS))
MAIN_SRC = main.c
# 目标:链接静态库
$(TARGET): $(MAIN_SRC) $(STATIC_LIB)
$(CC) $(CFLAGS) $(MAIN_SRC) -o $@ -L$(LIB_DIR) -l$(LIB_NAME)
# 编译静态库
$(STATIC_LIB): $(LIB_OBJS)
ar rcs $@ $^ # 打包.o为静态库
# 生成.o文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(TARGET) $(STATIC_LIB) $(LIB_OBJS)
执行:make → ./calc → make clean。
练习 6:编译动态库并链接
修改 Makefile(仅替换静态库部分):
CC = gcc
CFLAGS = -Wall
TARGET = calc
LIB_NAME = calc
LIB_DIR = ./
DYNAMIC_LIB = lib$(LIB_NAME).so # 动态库
LIB_SRCS = add.c sub.c
LIB_OBJS = $(patsubst %.c, %.o, $(LIB_SRCS))
MAIN_SRC = main.c
# 目标:链接动态库
$(TARGET): $(MAIN_SRC) $(DYNAMIC_LIB)
$(CC) $(CFLAGS) $(MAIN_SRC) -o $@ -L$(LIB_DIR) -l$(LIB_NAME)
# 编译动态库:-fPIC(位置无关),-shared(共享库)
$(DYNAMIC_LIB): $(LIB_OBJS)
$(CC) -fPIC -shared -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
rm -f $(TARGET) $(DYNAMIC_LIB) $(LIB_OBJS)
执行:
make # 解决动态库路径问题(临时生效) export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./calc # 运行成功
构建工具学习 文章被收录于专栏
make cmake

