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)