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

functions.c

#include <stdio.h>

#include "functions.h"

void
hello ()
{
  printf ("Hello, world!\n");
}

functions.h

void hello ();

main.c

#include "functions.h"

int
main ()
{
  hello ();

  return 0;
}

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
	$(CC) $(CFLAGS) -fPIC -c -o $@ $<

$(LIB_TARGET): $(LIB_OBJ)
	# 在这里指定如何生成 libfunctions.so
	$(CC) $(LDFLAGS) -shared -o $@ $<

$(TARGET): $(OBJS) $(LIB_TARGET)
	# 在这里指定如何链接 libfunctions.so 来生成 TARGET
	$(CC) $(LDFLAGS) -o $@ $(OBJS)	-L$(OUTPUT_DIR) -lfunctions $(RPATH) 

$(TEST_TARGET): $(TEST_OBJS) $(LIB_TARGET)
	# 在这里指定如何链接 libfunctions.so 来生成 TEST_TARGET
	$(CC) $(LDFLAGS) -o $@ $(TEST_OBJS) -L$(OUTPUT_DIR) -lfunctions $(RPATH)

%.o: %.c
	# 在这里指定如何编译所有 C 文件
	$(CC) $(CFLAGS) -c -o $@ $<

test: $(TEST_TARGET)
	$(TEST_TARGET)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值