Я видел хуже. Давайте рассмотрим это немного за один раз.
z80_srcs = disas.c iosim.c sim0.c sim1.c sim2.c sim3.c sim4.c sim5.c sim6.c sim7.c simctl.c simfun.c simglb.c simglb.h sim.h simint.c
Как правило, не рекомендуется объединять исходные файлы и файлы заголовков. Давайте разделим их:
z80_srcs = disas.c iosim.c sim0.c sim1.c sim2.c sim3.c sim4.c sim5.c sim6.c sim7.c simctl.c simfun.c simglb.c simint.c
z80_hdrs = simglb.h sim.h
Я одобряю перечисление их в явном виде, но, как вы знаете, вы можете сделать Make fine их с помощью функции wildcard
:
z80_srcs = $(wildcard src/*.c z80/*.c)
(Но они будут идти с прикрепленными путями, так что вам придется с этим справиться.) Также, как мимолетное примечание, имя z80_srcs
неоднозначно, поскольку оно может ссылаться на источники в z80
. Аналогично, имя src/
вводит в заблуждение, поскольку оно не содержит всех источников. Но я думаю, что знаю, что вы имеете в виду.
z80_objs = disas.o iosim.o ...
В этом нет необходимости. Используйте функцию patsubst
:
z80_objs = $(patsubst %.c,%.o,$(z80_srcs))
Но disas.o iosim.o ...
не так полезен, как obj/disas.o obj/iosim.o ...
, поэтому давайте настроим строку:
z80_objs = $(patsubst %.c,obj/%.o,$(z80_srcs))
Теперь, чтобы построить объекты.
$(z80_objs): $(z80_srcs)
gcc -c -Wall $^
Это работает, но не так, как вы думаете. Это одно правило, которое строит все объекты, независимо от того, устарели они или нет, за одну операцию. Эффективно, но грубо. И он не помещает объекты туда, куда вы хотите.
Давайте создадим один объектный файл из командной строки:
gcc -c -Wall disas.c
Это не сработает по нескольким причинам. , 1) Компилятор не может найти disas.c
, 2) он также не может найти sim.h
, что требуется disas.c
, и 3) он попытается создать объектный файл в рабочем каталоге. Вот решение, и вам следует изучить и понять его, а не просто скопировать и вставить:
gcc -c -Wall src/disas.c -Isrc -o obj/disas.o
Итак, мы можем написать правило:
obj/disas.o: src/disas.c
gcc -c -Wall src/disas.c -Isrc -o obj/disas.o
Этот ответ становится длинным так что я прыгну прямо к правилу шаблона. Еще раз призываю вас учиться и понимать, , а не попугай.
vpath %.c src z80
obj/%.o: %.c
gcc -c -Wall $< -Isrc -o $@
И исполняемый файл:
obj/$(EXE): $(z80_objs)
gcc -o $@ main.c -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic $^