阶段 1.3: Make 实战(编译静态库 / 动态库 + 链接)

学习目标

  1. 掌握静态库(.a)和动态库(.so)的编译
  2. 学会链接库(静态链接、动态链接)
  3. 理解库的搜索路径

核心知识点

  1. 静态库编译ar rcs libxxx.a obj1.o obj2.o(打包.o 文件为静态库)
  2. 动态库编译gcc -fPIC -shared -o libxxx.so obj1.o obj2.o(生成位置无关的动态库)
  3. 链接库gcc -o target src.o -L./ -lxxx-L指定库路径,-l指定库名,省略lib和后缀)

实战练习

练习 5:编译静态库并链接

步骤 1:复用add.csub.ccalc.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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务