Статическая библиотека -- не более чем пачка объектных файлов в одном
архиве. Каждый объект компилируется самым естественным образом, с
флагом -c (остановиться после компиляции). В библиотеку объекты
собираются командой ar; в простейшем случае,
ar cr library-name obj1.o obj2.o ...
В зависимости от версии ar, может понадобиться вызвать ranlib (он
строит оглавление библиотеки, некоторые версии ar сами это умеют).
См. man ar, man ranlib а также info "GNU Make" (раздел про архивы).
Динамическая библиотека строится линкером; проще всего вызвать
gcc -shared -Wl,-soname,libxyz.so.0 -о libxyz.so.0.0
(обратите внимание, что filename библиотеки не совпадает с ее
soname), и организовать пару символических ссылок:
libxyz.so.0 --> libxyz.so.0.0
libxyz.so --> libxyz.so.0
Написание функций и заголовков тоже военной тайны не содержит.
Следуйте обычной практике Хорошего Кода. Избегайте зависимостей
между объектами. Экспортируйте один include на библиотеку; включайте
его в *каждый* исходник библиотеки; избегайте глобальных данных;
не загрязняйте namespace.
Если в не ответил на ваши вопросы, уточняйте.
Успехов.