第五题 - MakeFile - 构建第一个动态链接库

本节目录

题目要求

  • 修改 Makefile,能够将 functions.c 编译为动态链接库 libfunctions.so
  • 使用该库编译出可执行程序并运行它。
  • 此处的“它”指能够成功生成 Makefile 中的 TARGET 和 TEST_TARGET。

输入

# 将会在测试脚本中尝试:
make all

输出

应该产生一个名为 exercise-05 的可执行文件和一个名为 exercise-05_test 的可执行文件。

已有代码介绍

已有四个源代码文件和一个 MakeFile 文件,你只需要修改 MakeFile 文件即可。

源代码文件

  • main.c: 程序的入口点
  • functions.c: 提供各种函数,其中包括 hello 函数
  • functions.h: 提供函数声明
  • test.c:用于提供对 hello 函数进行测试的源代码文件

MakeFile 文件

CC ?= gcc

CFLAGS	= -std=c11 -Wall -Wextra -Wpedantic -Werror -g
LDFLAGS = -Wl,--as-needed -Wl,--no-undefined

OUTPUT_DIR ?= .

SRCS		= main.c
OBJS		= $(SRCS:.c=.o)
TARGET		= $(OUTPUT_DIR)/exercise-05

LIB_NAME	= libfunctions.so
LIB_TARGET	= $(OUTPUT_DIR)/$(LIB_NAME)
LIB_SRC		= functions.c
LIB_OBJ		= $(LIB_SRC:.c=.o)
RPATH		=  -Wl,-rpath,'$$ORIGIN'

TEST_SRCS	= test.c functions.c
TEST_OBJS	= $(TEST_SRCS:.c=.o)
TEST_TARGET = $(OUTPUT_DIR)/exercise-05_test

all: $(TARGET) test

$(OUTPUT_DIR):
	mkdir -p $(OUTPUT_DIR)

$(LIB_OBJ): $(LIB_SRC)
	# 在这里指定如何编译 libfunctions.o

$(LIB_TARGET): $(LIB_OBJ)
	# 在这里指定如何生成 libfunctions.so

$(TARGET): $(OBJS) $(LIB_TARGET)
	# 在这里指定如何链接 libfunctions.so 来生成 TARGET

$(TEST_TARGET): $(TEST_OBJS) $(LIB_TARGET)
	# 在这里指定如何链接 libfunctions.so 来生成 TEST_TARGET

%.o: %.c
	# 在这里指定如何编译所有 C 文件

test: $(TEST_TARGET)
	$(TEST_TARGET)

clean:
	rm -f $(LIB_TARGET) $(TARGET) $(TEST_TARGET) $(OBJS) $(LIB_OBJ) $(TEST_OBJS)

提示

你需要在 MakeFile 文件中的中文注释附近,完成所需要执行的逻辑。有和上一题相似的地方的话,可以考虑复用。剩下的内容,如果遇到困难,那么大概率是因为三种情况引起:

  1. 对 MakeFile 不熟,读不懂框架代码
  2. 只熟悉写死的 MakeFile,不知道使用 MakeFile 里的变量,读不懂框架代码
  3. 对 gcc 编译不熟,知道怎么写 MakeFile 但是不知道怎么写编译命令

如果遇到上面问题,可以对症下药,通过视频、AI、问老师等多种方式进行解决。比如,可以搜索“gcc 生成动态库”。

注意事项

不要修改源代码文件!