Все опубликованные ссылки хороши. Для вашего конкретного случая вы можете попробовать это. По сути, все Make-файлы следуют этому шаблону. Все остальное - ярлыки и макросы.
program: main.o dbAdapter.o
gcc -o program main.o dbAdapter.o
main.o: main.c dbAdapter.h
gcc -c main.c
dbAdapter.o dbAdapter.c dbAdapter.h
gcc -c dbAdapter.c
Ключевым моментом здесь является то, что Makefile последовательно просматривает правила и создает по мере необходимости определенные элементы.
Сначала он посмотрит на программу и увидит, что для сборки программы требуется нечто, называемое main.o и dbAdapter.o.
Затем он найдет main.o. Однако для сборки main.o ему понадобятся main.c и dbAdapter.h (я предполагаю, что dbAdapter.h включен в main.c).
Он будет использовать эти источники для сборки main.o путем его компиляции с использованием gcc. -C указывает на то, что мы только хотим скомпилировать.
То же самое происходит с dbAdapter.o. Когда у него есть эти два объектных файла, он готов связать их. Для этого шага также используется компилятор gcc. -O указывает, что мы создаем файл с именем program.