make: switch to shared object library
diff --git a/Makefile b/Makefile
index 2aada0c..8dd3c1d 100644
--- a/Makefile
+++ b/Makefile
@@ -48,7 +48,7 @@
 bin_list :=
 
 define add-lib
-    $(eval $(1)_bin ?= $(1).a)
+    $(eval $(1)_bin ?= $(1).so)
     $(eval $(1)_bin := $(addprefix $(BIN_DIR)/,$($(1)_bin)))
 
     lib_list += $(1)
@@ -72,7 +72,6 @@
                        $(patsubst %.s,%.o,$(filter %.s,$($(1)_src))) \
                        $(patsubst %.cc,%.o,$(filter %.cc,$($(1)_src))))
     $(eval $(1)_obj := $(addprefix $(BUILD_DIR)/,$($(1)_obj)))
-    $(eval $(1)_lib := $(foreach lib, $($(1)_lib), $($(lib)_bin)))
 
     $($(1)_obj): INCLUDE  += $($(1)_include)
     $($(1)_obj): DEFINE   += $($(1)_define)
@@ -81,7 +80,6 @@
 
     -include $($(1)_obj:.o=.d)
 
-    $($(1)_bin): $($(1)_lib)
     $($(1)_bin): $($(1)_obj)
     $($(1)_bin): $($(1)_dependencies)
 
@@ -138,16 +136,17 @@
 	    $(addprefix -I,$(INCLUDE)) \
 	    $(addprefix -D,$(DEFINE)) -MMD -MF $(@:.o=.d) -o $@
 
+$(LIB): CFLAGS += -fPIC
 $(LIB): $(MAKEFILE_DEPS)
-	@echo "  AR      $(notdir $@)"
+	@echo "  LD      $(notdir $@)"
 	$(V)mkdir -p $(dir $@)
-	$(V)$(AR) rcs $@ $(filter %.o,$^)
+	$(V)$(LD) $(filter %.o,$^) -shared -o $@
 
 $(BIN): $(MAKEFILE_DEPS)
 	@echo "  LD      $(notdir $@)"
 	$(V)mkdir -p $(dir $@)
-	$(V)$(LD) $(filter %.o,$^) $(filter %.a,$^) $(LDFLAGS) \
-	    $(addprefix -l,$(LDLIBS)) -o $@
+	$(V)$(LD) $(filter %.o,$^) \
+	    $(LDFLAGS) -L $(BIN_DIR) $(addprefix -l,$(LDLIBS)) -o $@
 
 clean:
 	$(V)rm -rf $(BUILD_DIR)
diff --git a/README.md b/README.md
index 0916572..d183393 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@
 $ make -j
 ```
 
-Compiled library `liblc3.a` will be found in `bin` directory.
+Compiled library `liblc3.so` will be found in `bin` directory.
 
 LC3 Plus features can be selectively disabled :
 - `LC3_PLUS=0` disable the support of 2.5ms and 5ms frame durations.
@@ -81,13 +81,17 @@
 In such way you can easly test encoding / decoding loop with :
 
 ```sh
-$ ./elc3 <in.wav> -b <bitrate> | ./dlc3 > <out.wav>
+$ alias elc3="LD_LIBRARY_PATH=`pwd`/bin `pwd`/bin/elc3"
+$ alias dlc3="LD_LIBRARY_PATH=`pwd`/bin `pwd`/bin/dlc3"
+$ elc3 <in.wav> -b <bitrate> | dlc3 > <out.wav>
 ```
 
 Adding Linux `aplay` tools, you will be able to instant hear the result :
 
 ```sh
-$ ./elc3 <in.wav> -b <bitrate> | ./dlc3 | aplay
+$ alias elc3="LD_LIBRARY_PATH=`pwd`/bin `pwd`/bin/elc3"
+$ alias dlc3="LD_LIBRARY_PATH=`pwd`/bin `pwd`/bin/dlc3"
+$ elc3 <in.wav> -b <bitrate> | dlc3 | aplay -D pipewire
 ```
 
 ## Test
@@ -141,8 +145,6 @@
 
 ```sh
 $ meson build
-$ cd build
-$ ninja
-$ sudo ninja install
+$ cd build && meson install
 ```
 
diff --git a/fuzz/makefile.mk b/fuzz/makefile.mk
index 4c83de2..a8f5311 100644
--- a/fuzz/makefile.mk
+++ b/fuzz/makefile.mk
@@ -17,8 +17,8 @@
 efuzz_src += \
     $(FUZZ_DIR)/efuzz.cc
 
-efuzz_lib += liblc3
-efuzz_ldlibs += m
+efuzz_ldlibs += lc3 m
+efuzz_dependencies += liblc3
 
 $(eval $(call add-bin,efuzz))
 
@@ -26,8 +26,8 @@
 dfuzz_src += \
     $(FUZZ_DIR)/dfuzz.cc
 
-dfuzz_lib += liblc3
-dfuzz_ldlibs += m
+dfuzz_ldlibs += lc3 m
+dfuzz_dependencies += liblc3
 
 $(eval $(call add-bin,dfuzz))
 
@@ -44,9 +44,9 @@
 efuzz dfuzz: LDFLAGS  += $(FUZZER_SANITIZE)
 
 dfuzz:
-	$(V)$(dfuzz_bin) -runs=1000000
+	$(V)LD_LIBRARY_PATH=$(BIN_DIR) $(dfuzz_bin) -runs=1000000
 
 efuzz:
-	$(V)$(efuzz_bin) -runs=1000000
+	$(V)LD_LIBRARY_PATH=$(BIN_DIR) $(efuzz_bin) -runs=1000000
 
 fuzz: efuzz dfuzz
diff --git a/tools/makefile.mk b/tools/makefile.mk
index cc19c29..61d1f97 100644
--- a/tools/makefile.mk
+++ b/tools/makefile.mk
@@ -19,9 +19,8 @@
     $(TOOLS_DIR)/lc3bin.c \
     $(TOOLS_DIR)/wave.c
 
-elc3_lib += liblc3
-elc3_ldlibs += m
-elc3_ldflags += -flto
+elc3_ldlibs += lc3 m
+elc3_dependencies += liblc3
 
 $(eval $(call add-bin,elc3))
 
@@ -31,9 +30,8 @@
     $(TOOLS_DIR)/lc3bin.c \
     $(TOOLS_DIR)/wave.c
 
-dlc3_lib += liblc3
-dlc3_ldlibs += m
-elc3_ldflags += -flto
+dlc3_ldlibs += lc3 m
+dlc3_dependencies += liblc3
 
 $(eval $(call add-bin,dlc3))